今天学习了openCV的三个例子,分别是图像腐蚀,图像模糊,还有图像边缘检测,三个例子分别用了openCV提供的相关运算函数,实现基本形态学运算。
首先第一个例子是 - 图像腐蚀,腐蚀和膨胀是图像形态学处理的最基本操作。
膨胀是指将一些图像或是图像中的一部分区域,我们称之为A的区域与核- 我们称之为B的区域进行卷积。膨胀用于求局部的最大值。
腐蚀则是膨胀的反操作,腐蚀操作要计算区域像素的最小值。
简单的来说腐蚀可以分割独立的图像元素,而膨胀则是用于连接相邻的元素。
相关的图形形态学先不深究,直接上程序:
VS2010新建控制台项目,新建cpp文件,并且放入用于测试的图片“1.jpg”,记住一定要放在和cpp文件同一个目录下
<span style="font-size:14px;">#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示效果
imshow("【原图】腐蚀操作",srcImage);
//运行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
Mat dstImage;
erode(srcImage,dstImage,element);
//显示效果图
imshow("【效果图】腐蚀操作",dstImage);
waitKey(0);
return 0;
}</span>
代码中的函数 getStructuringElement()函数,返回值:指向指定形状和尺寸的结构元素。
第一个参数:表示内核的形状,有三种形状可选,矩形: MORPH_RECT交叉形: MORPH_CROSS椭圆形: MORPH_ELLIPSE,
第二个参数: 表示内核的尺寸,
第三个参数: 表示锚点的位置。
以及关键的函数erode()
第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。
第二个参数: OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。
第三个参数: InputArray类型的kernel,腐蚀操作的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。
第四个参数: Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它。
第五个参数: int类型的iterations,迭代使用erode()函数的次数,默认值为1。
第六个参数: int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。
第七个参数: const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般不用。
上例子中用到前面三个参数,后面四个参数使用的是默认值。
运行看效果图:
第二个例子描述如何模糊一副图片
图像模糊也是图像处理的基本操作
同样VS2010新建控制台项目,新建cpp文件,并且放入用于测试的图片“1.jpg”,记住一定要放在和cpp文件同一个目录下
<span style="font-size:14px;">#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示效果
imshow("【原图】均值滤波",srcImage);
//机型均值滤波操作
Mat dstImage;
blur(srcImage,dstImage,Size(7,7));
//显示效果图
imshow("【效果图】均值滤波",dstImage);
waitKey(0);
return 0;
}
</span>
图像模糊有几种方法,例如平均模糊,高斯模糊,中值滤波,双边滤波等,
opencv针对这几种方法都提供了相关的函数来进行模糊操作,我们的例子中用到了
hlur()方法,即均值滤波:
blur( src, dst, Size( i, i ), Point(-1,-1) )
第一个参数:src:原始图像
第一个参数:dst:模糊图像
第一个参数:Size(i, i ):滤波模板大小
第一个参数:Point(-1,-1):中心点定位
上效果图:
第三个例子是边缘检测
所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征。边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。
同样VS2010新建控制台项目,新建cpp文件,并且放入用于测试的图片“1.jpg”,记住一定要放在和cpp文件同一个目录下
<span style="font-size:14px;">#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//载入原图
Mat srcImage = imread("1.jpg");
//显示效果
imshow("【原图】Canny边缘检测",srcImage);
//机型均值滤波操作
Mat edge,grayImage;
//[1]将原图像转换为灰度图像
cvtColor(srcImage,grayImage,CV_BGR2GRAY);
//[2]先用3x3的北河来降噪
blur(grayImage,edge,Size(3,3));
//[3] 运行Canny 算子
Canny(edge,edge,3,9,3);
//[4]显示效果图
imshow("【效果图】Canny边缘检测",edge);
waitKey(0);
return 0;
}</span>
使用的例子中用Canny算子来进行边缘检测,通过
Canny(InputArrayimage,OutputArray edges, double threshold1, double threshold2, intapertureSize=3,bool L2gradient=false )
第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。
第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和类型。
第三个参数,double类型的threshold1,第一个滞后性阈值。
第四个参数,double类型的threshold2,第二个滞后性阈值。
第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。
第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。
例子效果图: