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)局部自适应采用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、3)自定义阈值函数1本质也是使用cv.thresholddef 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、4)自定义阈值函数2利用阈值分值处理 大于Th_value=255 否则为0def 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要好一些。自定义的可以比较灵活的进行处理。