OpenCV 图像腐蚀、模糊、边缘检测{erode(),blur(),canny()}

本文介绍了三种常见的图像处理技术:图像腐蚀、图像模糊及边缘检测。通过具体的代码实现展示了每种技术的应用场景,并针对图像处理中可能出现的问题进行了分析,如边缘检测时图像丢失的现象及其原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、图像腐蚀

函数为:               

CV_EXPORTS_W void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor=Point(-1,-1), int iterations=1,
                         int borderType=BORDER_CONSTANT,const Scalar& borderValue=morphologyDefaultBorderValue() );  
二、图像模糊

函数为

//! a synonym for normalized box filter
CV_EXPORTS_W void blur( InputArray src, OutputArray dst,
                        Size ksize, Point anchor=Point(-1,-1),
                        int borderType=BORDER_DEFAULT );
三、边缘检测

函数为

//! applies Canny edge detector and produces the edge map.
CV_EXPORTS_W void Canny( InputArray image, OutputArray edges,
                         double threshold1, double threshold2,
                         int apertureSize=3, bool L2gradient=false );
四、测试代码

#pragma once

class BaseDeal
{
public:
	BaseDeal();
	//图像腐蚀
	void DealErode(std::string strFileName);
	//图像模糊
	void DealBlur(std::string strFileName);
	//图像边缘检测
	void DealCanny(std::string strFileName);
};
#include "stdafx.h"
#include "BaseDeal.h"

BaseDeal::BaseDeal()
{

}

void BaseDeal::DealErode(std::string strFileName)
{
	Mat srcMat = imread(strFileName);
	imshow("原图", srcMat);
	Mat matElement = getStructuringElement(MORPH_RECT, Size(15,15));
	Mat destMat;
	erode(srcMat, destMat, matElement);
	imshow("腐蚀", destMat);
	waitKey(1000);
}

void BaseDeal::DealBlur(std::string strFileName)
{
	Mat srcImage = imread(strFileName);
	imshow("均值滤波{原图}", srcImage);

	Mat destImage;
	blur(srcImage, destImage, Size(7,7));

	imshow("均值滤波{效果图}", destImage);
}

void BaseDeal::DealCanny(std::string strFileName)
{
	Mat srcImage = imread(strFileName);
	imshow("原始图{边缘检测}", srcImage);
	Mat matEdge; //边缘Mat
	Mat matGrayImage;//灰度图像Mat
	//将原图转换为灰度图像
	cvtColor(srcImage, matGrayImage, CV_RGB2GRAY/*CV_BayerRG2GRAY*/);
	//使用3*3内核降噪
	blur(matGrayImage, matEdge, Size(3,3));

	//运行CANNY算子
	Canny(matEdge, matEdge, 3,9,3);

	imshow("边缘检测效果图", matEdge);
	waitKey(1000);
}

main函数

#include "stdafx.h"
#include "BaseDeal.h"

int main()
{
	BaseDeal base;
	//base.DealErode("F:/1.jpg");
	//base.DealBlur("F:/1.jpg");
	base.DealCanny("F:/2.jpg");
	waitKey(6000);
}

结果图片

图像腐蚀:

图像模糊:

边缘检测:

这是由于

cvtColor(srcImage, matGrayImage, CV_BayerRG2GRAY); CV_BayerRG2GRAY>7,程序会崩溃,可能这个值过大会导致图片大小变大,最后结果图片可以看出只边缘检测了一小部分,还有一大部分被丢失掉了;

正确图像结果:

cvtColor这个函数存在OpenCV中有BUG,CV_EXPORTS_W void cvtColor( InputArray src, OutputArray dst, int code, int dstCn=0 ); code 的值不能超过7 ,也就是值为8就会崩溃。


1. imshow函数:用于在窗口中显示图像,其函数原型为: `void imshow(const string& winname, InputArray mat);` 参数 winname 表示窗口名称,mat 表示要显示的图像。示例代码如下: ```c++ #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lena.jpg"); imshow("lena", img); waitKey(0); return 0; } ``` 2. waitKey函数:用于等待键盘输入,其函数原型为: `int waitKey(int delay = 0);` 参数 delay 表示等待时间(毫秒),如果 delay 为 0,则表示一直等待键盘输入。示例代码如上。 3. erode函数:用于腐蚀图像,其函数原型为: `void erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1), int iterations=1, int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() );` 参数 src 表示输入图像,dst 表示输出图像,kernel 表示腐蚀的核,anchor 表示核的锚,iterations 表示腐蚀次数,borderType 表示边界类型,borderValue 表示边界值。示例代码如下: ```c++ #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lena.jpg"); Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3)); Mat dst; erode(img, dst, kernel); imshow("erode", dst); waitKey(0); return 0; } ``` 4. blur函数:用于平滑图像,其函数原型为: `void blur(InputArray src, OutputArray dst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT );` 参数 src 表示输入图像,dst 表示输出图像,ksize 表示平滑核的大小,anchor 表示核的锚,borderType 表示边界类型。示例代码如下: ```c++ #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lena.jpg"); Mat dst; blur(img, dst, Size(7, 7)); imshow("blur", dst); waitKey(0); return 0; } ``` 5. canny函数:用于边缘检测,其函数原型为: `void Canny(InputArray image, OutputArray edges, double threshold1, double threshold2, int apertureSize=3, bool L2gradient=false );` 参数 image 表示输入图像,edges 表示输出的边缘图像,threshold1 和 threshold2 表示边缘检测的两个阈值,apertureSize 表示 Sobel 滤波器的大小,L2gradient 表示是否使用 L2 范数计算梯度。示例代码如下: ```c++ #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lena.jpg", IMREAD_GRAYSCALE); Mat edges; Canny(img, edges, 50, 150); imshow("canny", edges); waitKey(0); return 0; } ``` 6. cvtColor函数:用于颜色空间转换,其函数原型为: `void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );` 参数 src 表示输入图像,dst 表示输出图像,code 表示转换的类型,dstCn 表示输出图像的通道数。示例代码如下: ```c++ #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat img = imread("lena.jpg"); Mat hsv_img; cvtColor(img, hsv_img, COLOR_BGR2HSV); imshow("hsv", hsv_img); waitKey(0); return 0; } ``` 以上就是 OpenCV 中 inshow、waitkey、erodeblurcannycvtColor 函数的用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值