【Emgu CV教程】3.1、色彩处理之图像反色

前面14篇介绍的都是Emgu CV内的基础概念和基础操作,目录设计的顺序可能有些问题,接下来我会参考一些专业的OpenCV教程目录,对比着进行EmguCV讲解。基础的东西讲完,下面讲Emgu CV对色彩的处理。

色彩就是人眼看上去是什么颜色的,如果能够把相应的颜色提取出来,很有可能就完成了图像算法的一大部分。比如对传送带上的水果进行分类统计,有红苹果、香蕉、山竹。苹果是红的,香蕉是黄色的,山竹偏黑紫色,只要按照对应颜色进行筛选,不就是挑出水果来了吗。

说的很简单,但是要怎么做呢,别着急,咱们一步一步讲。这一篇先讲一个最基础的颜色操作,反色处理。图像反色操作是一个最简单的图像处理技术,就是反转图像的像素强度,使图像中的前景变为背景,背景变为前景。再简单一点说,取反后的图像就是用255 - 原始像素点。白色的图片取反就是黑色的;黑色的图像取反就是白色的。那彩色的呢,下面介绍两种方法,您看看效果。使用的素材如下:六角星.jpg  和  lena.jpg。

1、BitwiseNot()函数图像反色

在前面介绍图像按位运算的时候就介绍过BitwiseNot()函数,这个就是图像取反用的函数,代码如下: 

Mat dstMat = new Mat();
CvInvoke.BitwiseNot(srcMat, dstMat);
CvInvoke.Imshow("BitwiseNot image, " + dstMat.Size.ToString(), dstMat);

用以上代码对  六角星.jpg  和  lena.jpg 取反,效果是:

单通道的图像就是255 - 原始像素值,而三通道图像,就是每个通道分别用255 - 原始像素值,再拼成最终图像。 

2、自定义函数完成图像反色

除了官方的算法,读者还可以自己手搓算法。这个是最简单的一类算法,我这里提供一段,抛砖引玉。在我的电脑上,处理图一张图片,效果是一样的,但这个算法比BitwiseNot()要慢0.008秒。看上去时间没差多少,但实际上差距还是很大。

Mat dstMat = srcMat.Clone();
int width = srcMat.Cols;
int height = srcMat.Rows;
Image<Bgr, int> dstImage = new Image<Bgr, int>(width, height);
Image<Bgr, int> tempImage = dstMat.ToImage<Bgr, int>();
for (int i = 0; i < height; i++)
{
    for (int j = 0; j < width; ++j)
    {
        dstImage.Data[i, j, 0] = 255 - tempImage.Data[i, j, 0];
        dstImage.Data[i, j, 1] = 255 - tempImage.Data[i, j, 1];
        dstImage.Data[i, j, 2] = 255 - tempImage.Data[i, j, 2];
    }
}

dstMat = dstImage.Mat;
dstMat.ConvertTo(dstMat, DepthType.Cv8U);
CvInvoke.Imshow("Custom function,result Mat, " + dstMat.Size.ToString(), dstMat);

学习Emgu CV就要多写代码,多用不通的图片进行试验。反色处理是最简单的一种颜色处理方法,可以使图像的明亮区域变暗,暗区域变明亮。多数情况下都是要再配合其它的算法做进一步的处理。

今天介绍的比较简单,也好理解,下一篇介绍我认为图像处理中最重要的一种图像:灰度图。

原创不易,请勿抄袭。共同进步,相互学习。

  • 17
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值