原圖
結果圖
//包含頭文件
#include <opencv2/opencv.hpp>//命名空間
using namespace cv;
using namespace std;//全局函數聲明部分//我的腐蝕運算
Mat Erode(Mat src, Mat Mask, uint32_t x0, uint32_t y0)
{uint32_t x = 0, y = 0;Mat dst(src.rows, src.cols, CV_8U, Scalar(0));for (x = 0; x < src.cols; ++x){for (y = 0; y < src.rows; ++y){uint8_t dst_P = 255;for (uint32_t xm = 0; xm < Mask.cols; ++xm){for (uint32_t ym = 0; ym < Mask.rows; ++ym){if (dst_P && Mask.at<uchar>(Point(xm, ym)) && (x + xm) < src.cols && (y + ym) < src.rows)if (dst_P > src.at<uchar>(Point(x + xm, y + ym))) //尋找最小值dst_P = src.at<uchar>(Point(x + xm, y + ym));}if (!dst_P)break;}if (dst_P && (x + x0) < src.cols && (y + y0) < src.rows)dst.at<uchar>(Point(x + x0, y + y0)) = dst_P;}}return dst;
}//我的膨脹運算
Mat Dilate(Mat src, Mat Mask, uint32_t x0, uint32_t y0)
{uint32_t x = 0, y = 0;Mat dst(src.rows, src.cols, CV_8U, Scalar(0));for (x = 0; x < src.cols; ++x){for (y = 0; y < src.rows; ++y){uint8_t dst_P = 0;for (uint32_t xm = 0; xm < Mask.cols; ++xm){for (uint32_t ym = 0; ym < Mask.rows; ++ym){if (dst_P != 255 && Mask.at<uchar>(Point(xm, ym)) && (x + xm) < src.cols && (y + ym) < src.rows)if (dst_P < src.at<uchar>(Point(x + xm, y + ym))) //尋找最大值dst_P = src.at<uchar>(Point(x + xm, y + ym));}if (dst_P == 255)break;}if (dst_P && (x + x0) < src.cols && (y + y0) < src.rows)dst.at<uchar>(Point(x + x0, y + y0)) = dst_P;}}return dst;
}//主函數
int main(int argc, char* argv[])
{//【1】載入圖像,灰度化Mat image = imread("2.png", 0);//灰度原圖//【2】檢查是否載入成功if (image.empty()){printf("讀取圖片錯誤,請確認目錄下是否有imread函數指定圖片存在!\n");return 0;}//【3】生成結構元素uint8_t element_a[7][7] ={ 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, };Mat element = Mat(7, 7, CV_8U, element_a);//【4】顯示圖像imshow("原灰度圖像", image);//【5】腐蝕運算Mat erodedImage;erode(image, erodedImage, element);imshow("Opencv的腐蝕運算", erodedImage);imshow("我的腐蝕運算", Erode(image, element, 3, 3));//【6】膨脹運算Mat dilatedImage;dilate(image, dilatedImage, element);imshow("Opencv的膨脹運算", dilatedImage);imshow("我的膨脹運算", Dilate(image, element, 3, 3));//【7】開運算Mat OpenImage;morphologyEx(image, OpenImage, MORPH_OPEN, element);imshow("Opencv的開運算", OpenImage);imshow("我的開運算", Dilate(Erode(image, element, 3, 3), element, 3, 3)); //開運算即先腐蝕再膨脹//【8】閉運算Mat CloseImage;morphologyEx(image, CloseImage, MORPH_CLOSE, element);imshow("Opencv的閉運算", CloseImage);imshow("我的閉運算", Erode(Dilate(image, element, 3, 3), element, 3, 3)); //閉運算即先膨脹再腐蝕//【10】保持窗口顯示waitKey(0);return 0;
}