多语言展示
当前在线:1169今日阅读:39今日分享:10

opencv+python实现彩色图片二值化 图片

图片二值化或者图像二值化是图像图片处理中非常常用的方法,处理方法也多种多样。比如全局阈值,局部自适应分块等等方法。二值化后就可以进行进一步处理
工具/原料
1

opencv3+python3

2

pycharm + win7环境

方法/步骤
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.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

2.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要好一些。自定义的可以比较灵活的进行处理。

注意事项
1

local_threshold 高斯法好一点

2

自定义比较灵活

3

全局效果不一定好

推荐信息