OpenCV:07.形态学,验证码,提取水平线,上、降采样

1. 形态学操作

morphologyEx

腐蚀:erode 取最小值
膨胀:dilate 取最大值

  • MORPH_OPEN 开:先腐蚀后膨胀
  • MORPH_CLOSE 闭:先膨胀后腐蚀
  • MORPH_GRADIENT 梯度:膨胀 - 腐蚀
  • MORPH_TOPHAT 顶帽:原图像 - 开图像
  • MORPH_BLACKHAT 黑帽:闭图像 - 原图像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
int main(){
Mat src = imread("E:/copy.png");

if (!src.data){
cout << "imread error" << endl;
return -1;
}

imshow("src", src);

Mat kernel = getStructuringElement(MORPH_RECT,Size(25,25));
Mat dst;
// 腐蚀
// erode(src, dst, kernel);
// 膨胀
//dilate(src,dst,kernel);

// MORPH_OPEN 开:先腐蚀后膨胀
// morphologyEx(src, dst,MORPH_OPEN,kernel);

// MORPH_CLOSE 闭:先膨胀后腐蚀
// morphologyEx(src,dst,MORPH_CLOSE,kernel);

// MORPH_GRADIENT 梯度:膨胀 - 腐蚀
//morphologyEx(src, dst, MORPH_GRADIENT, kernel);

// MORPH_TOPHAT 顶帽:原图像 - 开图像
// morphologyEx(src,dst,MORPH_TOPHAT,kernel);

// MORPH_BLACKHAT 黑帽:闭图像 - 原图像
morphologyEx(src,dst,MORPH_BLACKHAT,kernel);


imshow("dst",dst);

waitKey(0);
return 0;
}

2. 验证码识别

~ 符号表示 = (255 - 原本的像素值) 等同于 bitwise_not
adaptiveThreshold 二值化, 比如 > 125 的像素 设置为 255, 小于=125 的像素设置为 0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int main(){
Mat src = imread("E:/copy.png");

if (!src.data){
cout << "imread error" << endl;
return -1;
}

imshow("src", src);

// 2.1 把彩色变成 黑白 二值化
// 灰白
Mat gray;
cvtColor(src,gray,COLOR_BGR2GRAY);
// imshow("gray",gray);
// 二值化方法,自动阈值
// ~ 符号表示 = (255 - 原本的像素值) 等同于 bitwise_not
Mat binary;
adaptiveThreshold(~gray,binary,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,15,0);
imshow("binary",binary);

Mat kernel = getStructuringElement(MORPH_RECT,Size(5,5));
Mat dst;
// 腐蚀
erode(src,dst,kernel);
// 膨胀
dilate(src, dst, kernel);
// morphologyEx(src,dst,MORPH_CLOSE,kernel);
bitwise_not(dst, dst);

imshow("dst",dst);

waitKey(0);
return 0;
}

3. 提取水平线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int main(){
Mat src = imread("E:/copy.png");

if (!src.data){
cout << "imread error" << endl;
return -1;
}

imshow("src", src);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
// imshow("gray",gray);
// 二值化方法,自动阈值
// ~ 符号表示 = (255 - 原本的像素值) 等同于 bitwise_not
Mat binary;
adaptiveThreshold(~gray, binary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 0);

// 二值化有些小问题,做一下弥补
Mat kernel = getStructuringElement(MORPH_RECT, Size(9, 9));
Mat dst;
dilate(binary, dst, kernel);
erode(dst, dst, kernel);

// 取水平
Mat lLine = getStructuringElement(MORPH_RECT, Size(src.cols/16,1));
erode(dst,dst,lLine);
dilate(dst,dst,lLine);
imshow("dst",dst);


waitKey(0);
return 0;
}

4. 上采样与降采样

图片采样:采样(sampling)也称取样,指把时间域或空间域的连续量转化成离散量的过程。在数字图像处理领域中,定义为图像空间坐标的数字化操作。

  • pyrUp 上采样 放大 拉普拉斯:预计算(推算)值
  • pyrDown 降采样 缩小 高斯 ,1. 对图像进行高斯模糊,2.再过滤左右临近点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int main(){
Mat src = imread("E:/copy.png");

if (!src.data){
cout << "imread error" << endl;
return -1;
}

imshow("src", src);

Mat dst;
// 上采样 拉普拉斯 双线性插值,预计算(推算)值
// pyrUp(src,dst,Size(src.cols*2,src.rows*2));
// 降采样:1. 对图像进行高斯模糊,2.再过滤左右临近点。 采用的高斯 所以比较慢
pyrDown(src,dst,Size(src.cols/2,src.rows/2));

imshow("dst",dst);

// imwrite("E:/copy_pyrUp.png", dst);


waitKey(0);
return 0;
}
-------------本文结束感谢您的阅读-------------
坚持原创技术分享,您的支持将鼓励我继续创作!
0%