opencv-044-图像二化自适应阈值算法

知识点

OpenCV中的自适应阈值算法主要是基于均值实现,根据计算均值的方法不同分为盒子模糊均值与高斯模糊均值,然后使用原图减去均值图像,得到的差值图像进行自适应分割.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void cv::adaptiveThreshold(
InputArray src,
OutputArray dst,
double maxValue,
int adaptiveMethod,
int thresholdType,
int blockSize,
double C
)
其中blockSize取值必须是奇数,C取值在10左右

自适应方法类型:
ADAPTIVE_THRESH_GAUSSIAN_C = 1
ADAPTIVE_THRESH_MEAN_C = 0

当阈值操作类型thresholdType为:THRESH_BINARY
二值图像 = 原图 – 均值图像 > -C ? 255 : 0

当阈值操作类型thresholdType为:THRESH_BINARY_INV
二值图像 = 原图 – 均s值图像 > -C ? 0 : 255

代码(c++,python)

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
#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/*
* 自动阈值寻找与二值化
*/
int main() {
Mat src = imread("../images/text1.png");
if (src.empty()) {
cout << "could not load image.." << endl;
}
imshow("input", src);

// 自动阈值寻找与二值化
Mat gray, binary1, binary2;
cvtColor(src, gray, COLOR_BGR2GRAY);
// int T = mean(src)[0];
// threshold(gray, binary1, T, 255, THRESH_BINARY);
adaptiveThreshold(gray, binary2, 255, ADAPTIVE_THRESH_GAUSSIAN_C,
THRESH_BINARY, 25, 10);
// imshow("binary_T=mean", binary1);
imshow("binary_adaptive", binary2);

waitKey(0);
return 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
import cv2 as cv
import numpy as np

#
# THRESH_BINARY = 0
# THRESH_BINARY_INV = 1
# THRESH_TRUNC = 2
# THRESH_TOZERO = 3
# THRESH_TOZERO_INV = 4
#
src = cv.imread("D:/images/text1.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)
h, w = src.shape[:2]


# 自动阈值分割 TRIANGLE
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)
cv.imshow("binary", binary)

result = np.zeros([h, w*2, 3], dtype=src.dtype)
result[0:h,0:w,:] = src
result[0:h,w:2*w,:] = cv.cvtColor(binary, cv.COLOR_GRAY2BGR)
cv.putText(result, "input", (10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
cv.putText(result, "adaptive threshold", (w+10, 30), cv.FONT_ITALIC, 1.0, (0, 0, 255), 2)
cv.imshow("result", result)
cv.imwrite("D:/binary_result.png", result)

cv.waitKey(0)
cv.destroyAllWindows()

结果

代码地址

github