前面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就要多写代码,多用不通的图片进行试验。反色处理是最简单的一种颜色处理方法,可以使图像的明亮区域变暗,暗区域变明亮。多数情况下都是要再配合其它的算法做进一步的处理。
今天介绍的比较简单,也好理解,下一篇介绍我认为图像处理中最重要的一种图像:灰度图。
原创不易,请勿抄袭。共同进步,相互学习。