C++ OpenCV——形态学

#include<iostream>
#include<opencv2/opencv.hpp>


using namespace std;
using namespace cv;

void ImageErode()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(5*StructElementSize+1,2*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgerode;
	cv::erode(img,imgerode,element);
	imshow("Sourse",img);
	imshow("Erode",imgerode);
}
void ImageDilate()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(2*StructElementSize+1,5*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgdilate;
	cv::dilate(img,imgdilate,element);
	imshow("Sourse",img);
	imshow("Dilate",imgdilate);
}

void ImageOpen()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(2*StructElementSize+1,5*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgopen;
	cv::morphologyEx(img,imgopen,MORPH_OPEN,element);
	imshow("Sourse",img);
	imshow("Open",imgopen);
}
void ImageClose()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(2*StructElementSize+1,5*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgclose;
	cv::morphologyEx(img,imgclose,MORPH_CLOSE,element);
	imshow("Sourse",img);
	imshow("Close",imgclose);
}
void ImageTophat()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(2*StructElementSize+1,5*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgtophat;
	cv::morphologyEx(img,imgtophat,MORPH_TOPHAT,element);
	imshow("Sourse",img);
	imshow("Tophat",imgtophat);
}
void ImageBlackhat()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(2*StructElementSize+1,5*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgblackhat;
	cv::morphologyEx(img,imgblackhat,MORPH_BLACKHAT,element);
	imshow("Sourse",img);
	imshow("Blackhat",imgblackhat);
}
void ImageStep()
{
	Mat img = imread("Hole.png",0);
	int StructElementSize = 3;
	//MORPH_RECT 矩形
	//MORPH_CROSS 交叉形
	//MORPH_ELLIPE 椭圆形
	Mat element = cv::getStructuringElement(MORPH_RECT,Size(2*StructElementSize+1,5*StructElementSize+1),Point(StructElementSize,StructElementSize));
	Mat imgstep,imgdilate,imgerode;
	cv::dilate(img,imgdilate,element);
	cv::erode(img,imgerode,element);
	imgstep = imgdilate - imgerode;
	imshow("Sourse",img);
	imshow("Step",imgstep);
}
void hitormiss() 
{
	Mat src = imread("LolLogo.jpg",0);
	Mat he = src(Range(130,360),Range(130,360));
	//Mat Kernel_S1 = imread("LolLogo_E.jpg",0);//核-数字3
	Mat input_image = src.clone();
	Mat Kernel_S1 = he.clone();

	int threhold = 180;
	threshold(input_image, input_image, 180, 255, CV_THRESH_BINARY_INV);
	threshold(Kernel_S1, Kernel_S1, 180, 255, CV_THRESH_BINARY_INV);
	imshow("二值化图像", input_image);
	Mat Blankimage = Mat::ones(Kernel_S1.rows, Kernel_S1.cols, CV_8UC1);
	Mat Kernel_S2 = Blankimage * 255 - Kernel_S1;
	imshow("核1( D )", Kernel_S1);
	imshow("核2(W - D)", Kernel_S2);
 
 
	Mat hit_result, hit_result1, hit_result2;
	/// 腐蚀
	erode(input_image, hit_result1, Kernel_S1);
	imshow("hit_result1(D对A进行腐蚀)", hit_result1);
	Mat BigBlankimage = Mat::ones(input_image.rows, input_image.cols, CV_8UC1);
	input_image = BigBlankimage * 255 - input_image;
	imshow("反置图像", input_image);
	/// 腐蚀
	erode(input_image, hit_result2, Kernel_S2, Point(-1,-1), 1, BORDER_DEFAULT, 0);
	imshow("hit_result2(W-D)对A的补集进行腐蚀", hit_result2);
	hit_result = hit_result1 & hit_result2;
	imshow("击中击不中最终结果(交集)", hit_result);
	/// 查找击中点,验证结果
	for (int i = 0; i <input_image.rows; ++i)
	{
		uchar* data = hit_result.ptr<uchar>(i);
		for (int j = 0; j <input_image.cols; ++j)
		{
			int temp = (int)data[j];
			if (temp)
				cout << "Find "<<temp;
		}
	}
}
void main()
{
	ImageErode();
	ImageDilate();
	ImageOpen();
	ImageClose();
	ImageTophat();
	ImageBlackhat();
	ImageStep();
	cv::waitKey(0);
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vector_LW

我们终将成龙 加油

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值