- #include<iostream>
- #include<opencv2/core/core.hpp>
- #include<opencv2/highgui/highgui.hpp>
- #include<opencv2/imgproc/imgproc.hpp>
- using namespace std;
- using namespace cv;
- int main(){
- Mat image = imread("binary.bmp");
- imshow("Image",image);
- 腐蚀图像 默认3*3
- //Mat eroded;
- //erode(image,eroded,Mat());
- //imshow("Erode Image",eroded);
- 膨胀图像
- //Mat dilated;
- //dilate(image, dilated, Mat());
- //imshow("Dilate Image",dilated);
- 以7*7大小的数据结构进行腐蚀
- //Mat eroded2;
- //Mat element(7, 7, CV_8U, Scalar(1));
- //erode(image, eroded2, element);
- //imshow("element Image",eroded2);
- 以7*7大小的数据结构进行腐蚀3次
- //Mat eroded3;
- //Mat element3(7, 7, CV_8U, Scalar(1));
- //erode(image,eroded3,element3,Point(-1,-1),3);
- //imshow("eroded3",eroded3);
- //对图片进行闭运算
- Mat element5(5, 5, CV_8U, Scalar(1));
- Mat closed;
- morphologyEx(image, closed, MORPH_CLOSE, element5);
- imshow("closed", closed);
- //对图片进行开运算
- Mat opened;
- morphologyEx(image,opened,MORPH_OPEN,element5);
- imshow("opened",opened);
- //相继进行开运算和闭运算
- Mat opencvandclose;
- morphologyEx(image, opened, MORPH_OPEN, element5);
- morphologyEx(opened, opencvandclose, MORPH_CLOSE, element5);
- imshow("opencvandclose", opencvandclose);
- //相继进行闭运算和开运算
- Mat closeandopen;
- morphologyEx(image, closed, MORPH_CLOSE, element5);
- morphologyEx(closed, closeandopen, MORPH_OPEN, element5);
- imshow("closeandopen", closeandopen);
- //腐蚀图像 默认3*3
- Mat eroded;
- erode(image, eroded, element5);
- imshow("Erode Image",eroded);
- //先腐蚀在膨胀
- Mat erodedanddilated;
- Mat erodedanddilated2;
- erode(image, erodedanddilated, element5);
- dilate(erodedanddilated, erodedanddilated2, element5);
- imshow("erodedanddilated", erodedanddilated2);
- //先膨胀再腐蚀
- Mat dilateanderode;
- Mat dilateanderode2;
- dilate(image, dilateanderode, element5);
- erode(dilateanderode, dilateanderode2,element5);
- imshow("dilateanderode", dilateanderode2);
- //膨胀图像
- Mat dilated;
- dilate(image, dilated, element5);
- imshow("Dilate Image",dilated);
- waitKey(0);
- }
erode(InputArray src, OutputArray dst, InputArray kernel, Point anchor=Point(-1,-1),int iterations=1, int borderType=BORDER_CONSTANT,
const Scalar& borderValue=morphologyDefaultBorderValue() )
iterations:腐蚀次数
我们的形态学滤波都作用在二值图像或者灰度图像上
闭运算:对图像进行先膨胀,再腐蚀
开运算:对图像先腐蚀,再膨胀
例子2:
加了滚动条,参考: http://blog.csdn.net/poem_qianmo/article/details/23710721 浅墨的博客
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
Mat src, dst;
int TrackbarNum = 0;
int StructElementSize = 3;
void process();
void on_TrackbarNumChange(int, void *);
void on_ElementSizeChange(int,void *);
int main(){
src = imread("1.jpg");
if (!src.data)
cout << "oh no not find" << endl;
imshow("image",src);
namedWindow("效果图");
Mat element = getStructuringElement(MORPH_RECT, Size(2 * StructElementSize + 1, 2 * StructElementSize + 1), Point(StructElementSize, StructElementSize));
erode(src,dst,element);
imshow("效果图",dst);
createTrackbar("腐蚀/膨胀", "效果图",&TrackbarNum, 1, on_TrackbarNumChange);
createTrackbar("内核值", "效果图", &StructElementSize, 21, on_ElementSizeChange);
cout << "begin"<<endl
<< "按下‘q’时,退出……" << endl;
while (char(waitKey(1)) != 'q'){}
return 0;
}
void process(){
Mat element = getStructuringElement(MORPH_RECT, Size(2 * StructElementSize + 1, 2 * StructElementSize + 1), Point(StructElementSize, StructElementSize));
if (TrackbarNum == 0){
erode(src,dst,element);
}
else
{
dilate(src,dst,element);
}
imshow("效果图",dst);
}
void on_TrackbarNumChange(int, void *){
process();
}
void on_ElementSizeChange(int, void *){
process();
}