利用python opencv实现图像自适应二值化

228 篇文章 25 订阅
本文介绍了如何使用Python的OpenCV库进行图像自适应二值化处理,包括固定阈值和自适应阈值(算术平均法、高斯加权均值法)的方法,通过实例展示了不同方法的效果,强调自适应方法在处理图像时的优势。
摘要由CSDN通过智能技术生成
对灰度图像利用阈值得到一个二值化的图像,是常最常用的图像处理技术之一。例如,灰度大于127的图像设置为1、小于127的设置为0,这种处理便是固定阈值127的二值化处理。

自适应的二值化处理不同于固定阈值的处理,每个像素的阈值依赖于其邻近的像素灰度,为了得到(x,y)点的阈值T(x,y),我们需要进行以下处理。

  1. 在此像素周边选取一个bxb的区域,其中了是用户指定的。
  2. 计算此bxb区域的加权平均值。OpenCV提供了两种方法计算此加权均值,一种是算术平均法,另一种是高斯加权平均法,后者要计算均值时距离区域中心越近权重越大。我们将得到的加权均值计为WA(x,y)
  3. 将上述加权均值与一固定参数相减得到阈值T(x,y),此固定参数设为param1,则(x,y)点的阈值可以用下式进行计算: 
    T(x,y)=WA(x,y)-param1

这便是得到阈值的过程,下面我们在利用OpenCV库编程实现固定阈值和自适应阈值的方法,我将在IPython环境下实现。

导入必要的模块

%pylab
import cv2
   
   
  • 1
  • 2
  • 1
  • 2

读取图像

读取图像,并把图像转换为灰度图像并显示之。

im = imread("/home/bikz05/Desktop/image.jpg")
im_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
axis("off")
title("Input Image")
imshow(im_gray, cmap="gray")
show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

input image

固定阈值二值化

我们首先进行固定阈值二值化处理,固定阈值二值化处理利用cv2.threshold函数,此函数的原型为:

cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
   
   
  • 1
  • 1

其中:

  1. src 为输入图像;
  2. thresh 为阈值;
  3. maxval 为输出图像的最大值;
  4. type 为阈值的类型;
  5. dst 为目标图像。

此例中我们将阈值设置为50,阈值类型为cv2.THRESH_BINARY,则灰度在大于50的像素其值将设置为255,其它像素设置为0。

retval, im_at_fixed = cv2.threshold(im_gray, 50, 255, cv2.THRESH_BINARY) 
axis("off") 
title("Fixed Thresholding")
imshow(im_at_fixed, cmap = 'gray') 
show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

效果如下:

fixed thresholding

算术平法的自适应二值化

算术平均法的自适应二值化利用cv2.adaptiveThreshold实现,此函数的原型为:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
   
   
  • 1
  • 1

其中:

  1. src 为输入图像;
  2. maxval 为输出图像的最大值;
  3. adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;
  4. thresholdType: 阈值的类型;
  5. blockSize: b的值;
  6. C 为从均值中减去的常数,用于得到阈值;
  7. dst 为目标图像。

此例中我们将b设置为5,常数设置为10。

im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 10)
axis("off")
title("Adaptive Thresholding with mean weighted average")
imshow(im_at_mean, cmap = 'gray') 
show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

得到的结果如下图所示:

adaptive thresholding with mean weighted average

高斯加权均值法自适应二值化

高斯加权均值法自适应二值化也是利用cv2.adaptiveThreshold, 此函数的原型与上述相同:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
   
   
  • 1
  • 1

其中:

  1. src 为输入图像;
  2. maxval 为输出图像的最大值;
  3. adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;
  4. thresholdType: 阈值的类型;
  5. blockSize: b的值;
  6. C 为从均值中减去的常数,用于得到阈值;
  7. dst 为目标图像。
im_at_mean = cv2.adaptiveThreshold(im_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 5, 7)
axis("off")
title("Adaptive Thresholding with gaussian weighted average")
imshow(im_at_mean, cmap = 'gray') 
show()
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

处理结果如下:

adaptive thresholding with gaussian weighted average

就这么简单,显然自适应方法要比固定阈值的方法效果更好

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值