OpenCV學習:形態學操作

第九課 形態學操作(最好先變成二值圖像)
//輸入、輸出、形態學操作類型、結構元素

API:morphologyEx(src,dst,CV_MOP_BLACKHAT,kernel)

1.開操作 open
先腐蝕後膨脹,可以去掉小的對象,假設對象是前景色,背景是黑色

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_OPEN, kernel);

2.閉操作 close
先膨脹後腐蝕,可以填充小的洞,假設對象是前景色,背景是黑色

	kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_CLOSE, kernel);

3.形態學梯度 gradient
膨脹減去腐蝕,也稱基本梯度(其它還包含內部梯度,方向梯度)

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_GRADIENT, kernel;

4.頂帽 top hat
原圖像與開操作圖像的差值圖像

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_TOPHAT, kernel;

5.黑帽 black hat
閉操作圖像與原圖像的差值圖像:可以對瑕疵的小點測量做準備

	Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));
	morphologyEx(src, dst, CV_MOP_BLACKHATHAT, kernel;

第十課 提取水平與垂直線
1.原理方法
圖像形態學操作的時候,可以通過自定義結構元素實現結構元素輸入圖像的一些對象敏感
另外一些對象不敏感,這樣就可以讓敏感對象改變而不敏感對象保留輸出。通過兩個最基
本的形態學操作——膨脹與腐蝕,使用不同的結構元素實現對輸入圖像的操作,得到想要的
結果
膨脹——輸出的像素值是結構元素覆蓋下輸入圖像的最大像素值
腐蝕——輸出的像素值是結構元素覆蓋下輸入圖像的最小像素值
2.實現步驟
輸入彩色圖像——imread
轉化爲灰度圖像——cvtColor
轉化爲二值圖像——adaptiveThreadhold
//輸入,輸出,二值圖像最大值,自適應方法(ADAPTIVE_THRESH_MEAN_C,ADAPTIVE_THRESH_GAUSSIAN_C)
//閾值類型,塊大小,常量c可以爲正負和0

		adaptiveThreadhold(Mat src,Mat dst,double maxValue,int adaptiveMethod
		,int threshType,int blockSize,double c);

定義結構元素
開操作(腐蝕加膨脹)提取水平與垂直線

3.源代碼

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

	using namespace cv;
	int main(int argc, char** argv) {
		Mat src, dst;
		src = imread("D:/vcprojects/images/chars.png");
		if (!src.data) {
			printf("could not load image...\n");
			return -1;
		}

		char INPUT_WIN[] = "input image";
		char OUTPUT_WIN[] = "result image";
		namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
		imshow(INPUT_WIN, src);

		Mat gray_src;
		cvtColor(src, gray_src, CV_BGR2GRAY);
		imshow("gray image", gray_src);
		
		Mat binImg;
		adaptiveThreshold(~gray_src, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
		imshow("binary image", binImg);

		// 水平結構元素
		Mat hline = getStructuringElement(MORPH_RECT, Size(src.cols / 16, 1), Point(-1, -1));
		// 垂直結構元素
		Mat vline = getStructuringElement(MORPH_RECT, Size(1, src.rows / 16), Point(-1, -1));
		// 矩形結構
		Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3), Point(-1, -1));

		Mat temp;
		erode(binImg, temp, kernel);
		dilate(temp, dst, kernel);
		// morphologyEx(binImg, dst, CV_MOP_OPEN, vline);
		bitwise_not(dst, dst);
		//blur(dst, dst, Size(3, 3), Point(-1, -1));
		imshow("Final Result", dst);

		waitKey(0);
		return 0;
	}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章