利用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

智能推荐

CXF支持 SOAP1.1 SOAP1.2协议_weixin_33827590的博客-程序员秘密

SOAP协议分为两个版本 1.1 1.2 默认支持1.1   实现方式:   1.编写接口   import javax.jws.WebService;@WebServicepublic interface ISerivceTest { String sayHello(String name);}2.编写实现方式 im...

10+年程序员总结的20+条经验教训_weixin_34120274的博客-程序员秘密

博客原文地址:http://www.manew.com/thread-43391-1-1.html开发那点经验“说说”  1.从小事做起,然后再扩展  无论是创建一个新的系统,还是添加功能到现有的系统中,我总是从一个简单到几乎没有任何所需功能的版本启动,然后再一步一步地解决问题,直到满意为止。我从来没有妄想过能够一步登天。相反,我一边开发一边学习,同时新掌握的信息还可以用于解决方案中。  我很...

ServletConfig与ServletContext对象详解_servletcontext设置的参数_饮一曲 流年殇的博客-程序员秘密

ServletConfig与ServletContext对象详解一、ServletConfig对象    在Servlet的配置文件中,可以使用一个或多个标签为servlet配置一些初始化参数。(配置在某个servlet标签或者整个web-app下)    当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfi

《失业的程序员》(十二):潜意识的智商_iteye_828的博客-程序员秘密

(一)三观     什么叫三观?  如果用世界观、价值观、人生观来概括,那实在是太虚幻了。因为大部分人根本不知道如何在自己身上找到这三观。  卞工曾告诉我一个字面意义上的世界观解释,我认为很弓虽。他说:像他这种整天沉浸在代码中、整天只穿梭在两点一线之间的码农,甚至已经对天圆地方的理论产生了信任感,何来的世界观?有时心中的血突然来潮,想通过狗狗看看外面世界到底有多精彩也经常断断续续的实...

JAVA小程序简单学籍系统参考代码,登陆小程序,Jtree //Jtree,JDBC,Jframe_学籍查询小程序源码_qq_43941520的博客-程序员秘密

JAVA小程序简单学籍系统//Jtree,JDBC,Jframe我们可以先在JAVA写一个类打开数据库获取连接package sql;import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepar...

关于CONFIG_LOCALVERSION_AUTO设置去掉内核版本号SVN后缀_weixin_34319111的博客-程序员秘密

出处 http://blog.csdn.net/gqb_driver/article/details/8444528关于CONFIG_LOCALVERSION_AUTO设置去掉内核版本号SVN后缀分类: 嵌入式Linux驱动开发Linux Kernel2012-12-27 17:06807人阅读评论(0)收藏举报CONFIG_LOCALVERSION_linux驱动开发oma...

随便推点

springboot 使用poi导出excel文件,及注意项[email protected]的博客-程序员秘密

springboot 使用poi导出excel文件,及注意项1.maven依赖<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version></...

java excel相同的合并_Java使用Apache POI合并Excel连续相同内容的单元格_顽猴溜溜的博客-程序员秘密

环境:Apache POI 3.17;HSSFSheet;目的:对Excel表格中同一列,如果连续的两个或两个以上单元格的内容相同,则对这些单元格进行合并。实现代码:/*** 合并指定Excel sheet页、指定列中连续相同内容的单元格** @param sheet Excel sheet* @param column 指定列*/public static void mergeSpecifie...

软件工程综合实践专题——个人博客作业1_weixin_30892889的博客-程序员秘密

这次作业老师要求我们读一段别人写的小程序,并写写自己的感悟。emmmmmmmmmmmm首先找到一段这样的代码就十分不容易...毕竟网上许多代码都是伪代码Orz感谢室友提供的去年小学期大作业首先,这段代码给我的第一印象就是:这好说歹说也算是个管理系统,居然都写在一个cpp文件里......强迫症表示有些不爽其次,这段代码一看就知道,典型的VC6.0的风格!!!这里先放一小段出来....

Docker Desktop 已经支持 Apple M1 了_docker-desktop m1_K8sCat的博客-程序员秘密

在苹果 M1 芯片上使用的 Docker Desktop 目前是一个技术预览版,专门提供给想尝试 Docker Desktop 的实验性构建的苹果 M1 机器的早期采用者。注意:基于苹果 M1 芯片的 Docker Desktop 仍在开发中。建议不要在生产环境中使用技术预览版。已知的问题苹果 M1 的 Docker Desktop 的技术预览版目前有以下限制:预览版不会自动更新。必须手动安装任何将来的 Docker Desktop 版本。必须安装 Rosetta 2,因为某些二进制文件仍.

导出DLL 隐藏私有成员变量和成员函数 工厂方法_extr15的博客-程序员秘密

导出DLL 隐藏私有成员变量和成员函数 工厂方法

java中的四种引用 强、弱、软、虚_罗里的博客-程序员秘密

前言:我们都知道当eden满了会触发minor gc,那这时候被回收的都是一些什么对象呢?1.强引用强引起:简单的理解为我们自己new出来的一个对象。Student student = new Student();student.setName("luo_li");//当对象为null后gc就会回收这个没有用的对象student = null;System.gc();System.out.println(student);System.in.read();...

推荐文章

热门文章

相关标签