第九課 形態學操作(最好先變成二值圖像)
//輸入、輸出、形態學操作類型、結構元素
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;
}