利用python opencv实现图像自适应二值化_AI视觉网奇的博客-程序员秘密

技术标签: python宝典  opencv  

对灰度图像利用阈值得到一个二值化的图像,是常最常用的图像处理技术之一。例如,灰度大于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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/jacke121/article/details/75444872

智能推荐

《惢客创业日记》2020.02.11-02.21(周二)惢客的三个发展阶段(下)_敦厚的曹操的博客-程序员秘密

  之前的日记中关于“惢客的三个发展阶段”写了一篇一万两千字的日记,但是,只写了上篇,今天开始,准备再花几天的时间把“惢客的三个发展阶段”的下篇写完,也就是后面的两个阶段(产品阶段和生态阶段)。  说到后面的两个阶段,目前看来只是畅想,因为,惢客具体会发展到哪一步, 谁也说不清。不过回顾我的创业日记,从2018年9月1日第一篇日记开始,每天一篇,到现在应该差不多有60多万字了,说实话...

Activity显式启动-Activity隐式启动_Android_xi的博客-程序员秘密

Activity的启动方法显式启动:明确指定要启动的Activity的class或者包名.activity类名方式一:class跳转Intent intent = new Intent(Activity1.this,Activity2.class);startActivity(intent);方式二:包名.类名跳转Intent intent = new Intent();inten...

Greenplum数据库巡检报告_greenplum 日常巡检_盒马coding的博客-程序员秘密

更多的文章请关注作者微信公众号或访问作者github:https://github.com/xfg0218/greenplum--summarize作者公众号目录目录 21 巡检说明 62 查看集群硬件相关信息 62.1 查看集群当前系统时间 62.2 查看操作系统版本 72.3 查看内核版本 72.4 查看内存的详细信息 72.4.1查看内...

【LOSS】语义分割的各种loss详解与实现_mean iou0.5_咖啡味儿的咖啡的博客-程序员秘密

前言:在参加Kaggle的比赛中,有时遇到的分割任务是那种背景所占比例很大,但是物体所占比例很小的那种严重不平衡的数据集,这时需要谨慎的挑选loss函数。Loss:1.Log losslog loss其实就是TensorFlow中的 tf.losses.sigmoid_cross_entropy或者Keras的keras.losses.binary_crossentropy...

随便推点

数据库压力测试--MySQL数据库快速插入大量数据_高自强的博客的博客-程序员秘密

一、前言应本次数据库压力测试的要求,测试数据记录至少为千万级,所以,问题来了,如何快速插入大量数据.二、解决方法一第一种解决方法是在MySQL终端中实现的,具体方法如下. a.打开MySQl数据库;mysql -u root -pb.创建数据库;mysql> create database insertData;use insertData;create CREATE TABLE InsertTa

net-tools is needed by mysql-community-server-5.7.21-1.el7.x86_64_敲最野的bug的博客-程序员秘密

linux安装mysql时报的错,这句话意思是需要 net-tools解决方案(满足它,给它安排一个不就完事了):yum -y install net-tools解决!

1 2 3 4 5 6 7 8 9 = 110,在数字间填入加号或者减号(可以不填,但不能填入其它符号)使等式成立。..._weixin_34392906的博客-程序员秘密

一共有3^8种可能。答案:成功:12+34+56+7-8+9 = 110成功:12+3+45+67-8-9 = 110成功:12-3+4-5+6+7+89 = 110成功:1+2+34+5+67-8+9 = 110成功:1-2+3+45-6+78-9 = 110成功:123+4-5-6-7-8+9 = 110成功:123-4+5-6-7+8-9 = 110成功:123-4-5...

【项目实战全解】基于深度学习与自然语言处理的AI文本生成(自动写作)_cv君的博客-程序员秘密

文章目录一、项目演示:1:诗歌创作2:律诗与绝句3:小说篇4:自己的经济新闻篇二、原理解读Gpt-2简述何为语言模型与 BERT 的区别三、代码详解与训练教程训练数据半精度模型使用预训练步骤:四、生成文本文件结构注意五:实际落地项目与我的应用落地应用散文剧本演示:六:GPT-3简述与福利传送门你在网上看到的”水文“,近乎一半都是“机器人”编辑的!还在为写不出报告而苦恼吗?技术改变生活,从高中就听闻自动写文章技术,没曾想,竟然已经做到以假乱真的地步!今天来详解一下我接触过的文本,文本生成,机器问答,阅读理

java 反射和泛型-反射来获取泛型信息_weixin_30670151的博客-程序员秘密

通过指定对应的Class对象,程序可以获得该类里面所有的Field,不管该Field使用private 方法public。获得Field对象后都可以使用getType()来获取其类型。Class<?> type = f.getType();//获得字段的类型但此方法只对普通Field有效,若该Field有泛型修饰,则不能准确得到该Field的泛型参数,如Map<Strin...

MTK 平台Android6.0 系统集成第三方apk 的解决策略_六号码头的博客-程序员秘密

比如我要集成的apk 的名字叫ATest.apk1.在package/app/目录下面面加入一个文件夹文件夹名字:ATest(这里最好使用apk 一样的名字,方便以后更好的代码维护,如果使用其它随便命名的名字也是可以得。)2.把ATest.apk 放入到ATest 文件夹下,并且自己定义一个mk 文件。3.Android.mk 的配置如下所示:===========

推荐文章

热门文章

相关标签