Android基于OpenCV实现图像脱色

目录
  • 脱色
  • 原理
  • API
  • 操作
  • 效果
  • 源码

脱色

Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY)可以快速的实现图片脱色,其通过简单的计算将三通道图像转换成单通道图像,经典的灰度转换公式如下:

但是转换过的图像存在对比度丢失,无法区分颜色的问题。OpenCV给我们提供另外一种脱色方法Photo.decolor,旨在最大限度的保留图片对比度。

原理

论文详情:www.cse.cuhk.edu.hk/~leojia/pro

论文PDF:www.computer.org/csdl/pds/ap

相比于简单的使用R/G/B线性组合,作者构造了更为复杂的多项式拟合,向量空间的基底为:[r,g,b,rg,rb,gb,r2,g2,b2],核心就是求取灰度化函数:

API

public static void decolor(Mat src, Mat grayscale, Mat color_boost)
  • 参数一:src,输入8位三通道图像。
  • 参数二:grayscale,输出8位单通道灰度图。
  • 参数三:color_boost,输出8位三通道图像。对比度增强后的图像。

操作

/**
 * 脱色
 * author: yidong
 * 2020/12/5
 */
class DecolorActivity : AppCompatActivity() {

    private val mBinding: ActivityDecolorBinding by lazy {
        ActivityDecolorBinding.inflate(layoutInflater)
    }

    private val mList = mutableListOf<ImageTextObject>()
    private lateinit var mAdapter: ImageTextAdapter

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(mBinding.root)
        mAdapter = ImageTextAdapter(this, mList)
        mBinding.container.adapter = mAdapter
        val bgr = Utils.loadResource(this, R.drawable.ceil)
        val rgb = Mat()
        Imgproc.cvtColor(bgr, rgb, Imgproc.COLOR_BGR2RGB)
        val gray = Mat()
        val dst = Mat()
        val boost = Mat()
        mBinding.isLoading = true
        GlobalScope.launch(Dispatchers.IO) {
            Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY)
            Photo.decolor(rgb, dst, boost)
            launch(Dispatchers.Main) {
                mList.add(ImageTextObject(rgb, "原图"))
                mList.add(ImageTextObject(gray, "RGB2GRAY"))
                mList.add(ImageTextObject(dst, "DeColor"))
                mList.add(ImageTextObject(boost, "ColorBoosting"))
                mAdapter.notifyItemRangeInserted(0, 4)
                mBinding.isLoading = false
            }
        }
    }
}

效果

分别采用decolor和RGB2GRAY实现的脱色效果图,在对比度和颜色保留上效果相差很大。

源码

github.com/onlyloveyd/…

以上就是Android基于OpenCV实现图像脱色的详细内容,更多关于Android OpenCV图像脱色的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android基于OpenCV实现图像修复

    目录 API 操作 图像修复 实际应用中,图像常常容易受损,如存在污渍的镜头.旧照片的划痕.人为的涂画(比如马赛克),亦或是图像本身的损坏.将受到损坏的图像尽可能还原成原来的模样的技术,称之为图像修复.所谓修复,就代表图像大部分内容是完好的,所以,图像修复的原理,就是用完好的部分去推断受损部分的信息,特别是完好部分与受损部分的交界处,即受损区域的边缘,在这个推断过程中尤为重要. OpenCV给我们提供了inpaint方法来实现这个功能,并提供了两种图像修复的算法: 基于Navier-Stokes

  • Android基于OpenCV实现图像金字塔

    目录 图像金字塔 高斯金字塔 拉普拉斯金字塔 API 下采样 上采样 操作 操作 效果 源码 图像金字塔 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构. 图像金字塔最初用于机器视觉和图像压缩,一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合.其通过梯次向下采样获得,直到达到某个终止条件才停止采样. 金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似. 我们将一层一层的图像比喻成金字塔

  • Android基于OpenCV实现霍夫直线检测

    目录 霍夫直线检测 点和线的对偶性 极坐标参数方程 API 操作 效果 霍夫直线检测 点和线的对偶性 图像空间中的点,对应霍夫空间中的直线 图像空间中的直线,对应霍夫空间中的点 共点的直线,在霍夫空间中对应的点在一条直线上 共线的点,在霍夫空间中对应的直线交于一点 极坐标参数方程 对于平面中的一条直线,在笛卡尔坐标中,常见的有点斜式,两点式两种表示方法.然而在霍夫变换中,考虑的是另外一种表示方式:使用(r, theta)来表示一条直线.其中r为该直线到原点的距离,theta为该直线的垂线与x轴的

  • Android基于OpenCV实现QR二维码检测

    目录 QR二维码 QR二维码格式 QR二维码结构 API QRCodeDetector类结构 检测QR二维码 识别QR二维码 检测并识别QR二维码 操作 结果 源码 QR二维码 QR码(英语:Quick Response Code:全称为快速响应矩阵图码)是二维码的一种,于1994年由日本DENSO WAVE公司发明.QR来自英文Quick Response的缩写,即快速反应,因为发明者希望QR码可以快速解码其内容.QR码使用四种标准化编码模式(数字.字母数字.字节(二进制)和日文(Shift_

  • Android OpenCv4 绘制多边形的方法

    集成非常简单,直接按Module形式导入 sdk 即可 官方地址,打开选择Android 下载完成解压以后直接导入OpenCV-android-sdk目录下的sdk文件即可. 绘制矩形 方法 /** img 输入图像 pt1 左上起点 pt2 右下终点 color 绘制直线的颜色 thickness 直线宽度.若为负值,表示填充 lineType 边界的类型,可取值为FILLED ,LINE_4 ,LINE_8 和LINE_AA shift 点坐标中的小数位数 **/ public static

  • Android+OpenCv4实现边缘检测及轮廓绘制出图像最大边缘

    实现步骤: 图像灰度化 边缘检测 根据Canny检测得出来的Mat寻找轮廓 算出最大轮廓周长or面积 根据获取到的最大轮廓下标进行轮廓绘制 画出最大矩形,并返回Rect Canny边缘检测 基于Canny算法的边缘检测主要有5个步骤,依次是高斯滤波.像素梯度计算.非极大值像素梯度抑制.滞后阈值处理和孤立弱边缘抑制.Canny在有噪声的情况下表现好不好,取决于前面的降噪过程,可以手动做高斯处理提高识别率. /** image 输入图像,必须是CV_8U的单通道或者三通道图像. edges 输出图像

  • Android基于opencv实现多通道分离与合并

    目录 多通道分离 API 操作 通道合并 API 操作 结果 源码 多通道分离 API public static void split(Mat m, List<Mat> mv) 参数一:m,待分离的多通道图像 参数二:mv,分离后的单通道图像 操作 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mBinding = DataBindingUtil.setConte

  • Android基于OpenCV实现非真实渲染

    目录 非真实渲染 API 边缘保留滤波 细节增强 素描铅笔画 风格化 操作 效果 非真实渲染 非真实感渲染(Non Photorealistic Rendering,简称NPR),是指利用计算机模拟各种视觉艺术的绘制风格,也用于发展新的绘制风格.比如模拟中国画.水彩.素描.油画.版画等艺术风格.NPR也可以把三维场景渲染出丰富的.特别的新视觉效果,使它具备创新的功能.NPR渲染以强烈的艺术形式应用在动画.游戏等娱乐领域中,也出现在工程.工业设计图纸中.广阔的应用领域,不仅是由于它的艺术表现形式丰

  • 如何在Android上使用opencv

    1.下载OpenCV的Android包并解压缩(https://opencv.org/releases/) 2.创建Android应用或者在现有应用中,导入OpenCV模块 导入目录时选择Opencv Android中的sdk / java目录 3.修改导入的Opencv模块的build.gradle,使compileSdkVersion.buildToolsVersion.minSdkVersion.targetSdkVersion与app的build.gradle中的一致. 4.修改导入Op

  • Android基于OpenCV实现图像脱色

    目录 脱色 原理 API 操作 效果 源码 脱色 Imgproc.cvtColor(rgb, gray, Imgproc.COLOR_RGB2GRAY)可以快速的实现图片脱色,其通过简单的计算将三通道图像转换成单通道图像,经典的灰度转换公式如下: 但是转换过的图像存在对比度丢失,无法区分颜色的问题.OpenCV给我们提供另外一种脱色方法Photo.decolor,旨在最大限度的保留图片对比度. 原理 论文详情:www.cse.cuhk.edu.hk/~leojia/pro- 论文PDF:www.

  • Android基于OpenCV实现Harris角点检测

    目录 什么是角点? 为什么要检测角点? Harris角点检测 API 操作 效果 源码 什么是角点? 角点就是极值点,即在某方面属性特别突出的点.当然,你可以自己定义角点的属性(设置特定熵值进行角点检测).角点可以是两条线的交叉处,也可以是位于相邻的两个主要方向不同的事物上的点.角点通常被定义为两条边的交点,或者说,角点的局部邻域应该具有两个不同区域的不同方向的边界.常见的角点有: 灰度梯度的最大值对应的像素点: 两条直线或者曲线的交点: 一阶梯度的导数最大值和梯度方向变化率最大的像素点: 一阶

  • Python基于opencv的图像压缩算法实例分析

    本文实例讲述了Python基于opencv的图像压缩算法.分享给大家供大家参考,具体如下: 插值方法: CV_INTER_NN - 最近邻插值, CV_INTER_LINEAR - 双线性插值 (缺省使用) CV_INTER_AREA - 使用象素关系重采样.当图像缩小时候,该方法可以避免波纹出现.当图像放大时,类似于 CV_INTER_NN 方法.. CV_INTER_CUBIC - 立方插值. 函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小.若设定 ROI,函数将按

  • python 基于opencv 绘制图像轮廓

    图像轮廓概念 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形. 谈起轮廓不免想到边缘,它们确实很像.简单的说,轮廓是连续的,边缘并不全都连续(下图).其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手:而轮廓主要用来分析物体的形态,比如物体的周长和面积等,可以说边缘包括轮廓. 寻找轮廓的操作一般用于二值图像,所以通常会使用阈值分割或Canny边缘检测先得到二值图. 注意:寻找轮廓是针对白色物体的,一定要保证物体是白色,而背景是黑色,不然很多人在寻找轮廓时会找到图片最外面的一

随机推荐