#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);
}
C++ OpenCV——形态学
最新推荐文章于 2023-12-10 20:59:20 发布