【openCV入门之二】 快速上手

今天学习了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


例子效果图:










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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值