openCV+Python 数字图像处理(11)——图像二值化

1.基本概念及API介绍

(1) 全局阈值二值化

ret, binary = cv2.threshold(src: Any, thresh: Any, maxval: Any, type: Any, dst: Any = None)

src: 原图
thresh: 阈值,当阈值类型使用自适应阈值而无固定值时可设为0,不起作用
maxval: 最大值
type: 阈值类型
ret: 阈值
binary: 二值图像

阈值类型介绍
THRESH_BINARY过门限的值设置为maxVal,其它值置零
THRESH_BINARY_INV过门限的值置零,其它值设置为maxVal
THRESH_TRUNC过门限的值设置为门限值,其它值置不变
THRESH_TOZERO过门限的值不变,其它值置零
THRESH_TOZERO_INV过门限的值置零,其它值不变

自适应阈值方法:

全局/局部自适应阈值方法介绍
全局cv.THRESH_OTSU大律法
全局cv.THRESH_TRIANGLE适用于单个波峰

注意:
当采用自适应阈值时,thresh无固定值,可设为0,不起作用
示例:cv.THRESH_BINARY | cv.THRESH_OTSU

(2)局部阈值二值化

cv2.adaptiveThreshold(src: Any, maxValue: Any, adaptiveMethod: Any, thresholdType: Any, blockSize: Any, C: Any, dst: Any = None)

src: 原图
maxValue: 最大值
adaptiveMethod: 平均(cv2.ADAPTIVE_THRESH_MEAN_C)或高斯(cv2.ADAPTIVE_THRESH_GAUSSIAN_C)
thresholdType: 必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型
blockSize: 块大小(奇数且大于1,比如3,5,7… )
C: 常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值。

(3)超大图像二值化
当图像较大时,我们需要将图像进行分块,并在每一块上进行二值化。
当在每个小块上采用全局阈值二值化时,在有噪声的区域可能效果很差。这时我们可以进行空白图像过滤(计算每块的dev值,当dev值小于某个数时,赋值为255)
一般情况下采用局部阈值二值化效果较好。

2.代码示例

import cv2
import numpy as np

book = cv2.imread('E:/PycharmProjects/flower.jpg')


def show(name, img):
    cv2.imshow(name, img)
    cv2.waitKey(0)


show('flower', book)


# 1.全局阈值
def threshold_demo(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)
    print('th', ret)
    show('binary', binary)


threshold_demo(book)


# 2.局部阈值
def local_threshold(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    dst1 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 10)
    dst2 = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 25, 10)
    show('local_gs', dst1)
    show('local_mean', dst2)


local_threshold(book)


# 3.自定义阈值
def custom_threshold(img):
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    h, w = gray.shape[:2]
    m = np.reshape(gray, [1, h * w])
    mean = m.sum() / (h * w)
    print(mean)
    ret, binary = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)
    show('custom_binary', binary)

custom_threshold(book)

# 4.超大图像二值化
def big_img_bi(img):
    cw = 50
    ch = 50
    h, w = img.shape[:2]
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    for row in range(0, h, ch):
        for col in range(0, w, cw):
            roi = gray[row:row+ch, col:col+cw]
            dst = cv2.adaptiveThreshold(roi, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 5)
            gray[row:row + ch, col:col + cw] = dst
    show('big_bi', gray)

big_img_bi(book)

cv2.destroyAllWindows()

3.结果展示

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值