opencv+python实现彩色图片二值化 图片
1、二值图像处理分为两大步:
第一步:把彩色图像或图片处理成灰度片或图像(简称灰度化),
第二大步: 把灰度图通过阈值或者直方图或者自适应等方法转化为二值化图片。

2、第一大步:
1.1)imread加载图片
img = cv.imread('c:\\meiping1.png')
1.2)将彩色图片转化为灰度图,采用函数进行。
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
经过这两句话 灰度图产生了!


3、第二大步:
2.1)全局阈值法:
采用 cv.threshold进行处理,
参数:
thresholdValue: 阈值 two_value: 返回的二值图像 cv.THRESH_BINARY |cv.THRESH_OTSU: THRESH_BINARY是灰度图二值化,THRESH_OTSU是二值化的算法
def thresholdGlob(gray):
thresholdValue, two_value = cv.threshold(gray, 0, 255, cv.THRESH_BINARY |cv.THRESH_OTSU)
print('thresholdValue %s :' % (thresholdValue))
cv.imshow('thresholdGlob', two_value)

4、2.2)局部自适应
采用 cv.adaptiveThreshold进行处理,
参数:
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C, dst=None) adaptiveMethod: 有两种method ADAPTIVE_THRESH_GAUSSIAN_C和ADAPTIVE_THRESH_MEAN_C, thresholdType: 二值化的方式 blockSize: 最好是奇数 C: 偏置值
def local_threshold(gray): binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10) cv.imshow('local_threshold_GAUSSIAN-binary', binary)

5、2.3)自定义阈值函数1
本质也是使用cv.threshold
def custom_threshold(gray): h, w = gray.shape[:2] m = np.resize(gray, [1, w*h]) mean = m.sum() / (w*h) print('mean : ', mean) ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY) cv.imshow('custom_threshold', binary)

6、2.4)自定义阈值函数2
利用阈值分值处理 大于Th_value=255 否则为0
def threshold_one_block(image, Th_value): # img = np.array(image, 'f') # im_l = image.convert('L') tmp_img = copy.copy(image) # 复制一份
rows, cols = tmp_img.shape #已经是灰度图 只有2路 print(rows, cols) for rows in range(tmp_img.shape[0]): for cols in range(tmp_img.shape[1]): if tmp_img[rows,cols] < Th_value: #阈值条件判断 tmp_img[rows, cols] = 0 else: tmp_img[rows, cols] = 255 return tmp_img

7、调用:
tmp0 = threshold_one_block(gray, 85) #设置不同阈值cv.imshow('tmp0',tmp0)tmp1 = threshold_one_block(gray, 127) #设置不同阈值
cv.imshow('tmp1',tmp1)tmp2 = threshold_one_block(gray, 192) #设置不同阈值
cv.imshow('tmp2',tmp2)
图片二值有较大不同。




8、thresholdGlob(gray) local_threshold(gray)custom_threshold(gray)
分别进行运行。

9、整体感觉 感觉local_threshold要好一些。
自定义的可以比较灵活的进行处理。