看了好多博客,最终发现得好好研究一个人的博客并去做实验,才能达到最好的学习效果。

https://blog.csdn.net/on2way/article/details/46812121

参考其博客,并发现一个文档网址:

https://docs.opencv.org/3.2.0/d7/d4d/tutorial_py_thresholding.html

是不错的学习资料

本片博客主要使用python_opencv尝试了三种阈值处理方法,现总结如下,并把自己尝试的代码附上。

图像的阈值处理(python下opencv使用)

1.简单阈值

简单阈值最为简单,选取一个全局阈值,然后把整幅图像分成非黑即白的二值图像。函数为

cv.threshold(),该函数有四个参数,第一个为原图像,第二个进行分类的阈值,第三个是高于(低于)阈值时所赋予的新值,第四个是一个方法选择参数,常用方法选择参数有:

  • cv2.THRESH_BINARY(黑白二值) 高于阈值的设置为新值,低于阈值的为0
  • cv2.THRESH_BINARY_INV(黑白二值反转) 与上一个反过来
  • cv2.THRESH_TRUNC (得到的图像为多像素值) 高于阈值的全为阈值,低于阈值的不变
  • cv2.THRESH_TOZERO 高于阈值的不变,低于阈值的全为0
  • cv2.THRESH_TOZERO_INV 与上一个反过来
  • 相关代码:
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread("D:\\software_my_programming\\relate_to_irisrecog\\CASIA-Iris-Lamp\\001\\L\\S2001L01.jpg")#读取图像,0为灰度图像,1为彩色图像ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)titles = ['img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]for i in range(6):plt.subplot(2,3,i+1)plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

2.自适应阈值

自适应阈值看成是一个局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。使用函数为:cv2.adaptiveThreshold() (仅用于灰度图像)

该函数需要6个参数:

  • 第一个原始图像
  • 第二个像素值上限
  • 第三个自适应方法Adaptive Method:
  • — cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
  • —cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权 重为一个高斯窗口
  • 第四个值的赋值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
  • 第五个Block size:规定领域大小(一个正方形的领域)
  • 第六个常数C,阈值等于均值或者加权值减去这个常数(为0相当于阈值 就是求得领域内均值或者加权值)

这种方法理论上得到的效果更好,相当于在动态自适应的调整属于自己像素点的阈值,而不是整幅图像都用一个阈值。

  • 相关代码:
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread("D:\\software_my_programming\\\relate_to_irisrecog\\CASIA-Iris-Lamp\\001\\L\\S2001L01.jpg",0)#读取图像,0为灰度图像,1为彩色图像ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)thresh2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\cv2.THRESH_BINARY,11,2)thresh3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\cv2.THRESH_BINARY,11,2)titles = ['img','BINARY','ADAPTIVE_THRESH_MEAN_C','ADAPTIVE_THRESH_GAUSSIAN_C',]images = [img,thresh1,thresh2,thresh3]for i in range(4):plt.subplot(2,2,i+1)plt.imshow(images[i],'gray')plt.title(titles[i])plt.xticks([]),plt.yticks([])plt.show()

3.Otsu’s二值化

前面对于阈值的处理上,我们选择的阈值都是127,那么实际情况下,怎么去选择这个127呢?有的图像可能阈值不是127得到的效果更好。那么这里我们需要算法自己去寻找到一个阈值,而Otsu’s就可以自己找到一个认为最好的阈值。并且Otsu’s非常适合于图像灰度直方图具有双峰的情况,他会在双峰之间找到一个值作为阈值,对于非双峰图像,可能并不是很好用。那么经过Otsu’s得到的那个阈值就是函数cv2.threshold的第一个参数了。因为Otsu’s方法会产生一个阈值,那么函数cv2.threshold的的第二个参数(设置阈值)就是0了,并且在cv2.threshold的方法参数中还得加上语句cv2.THRESH_OTSU。那么什么是双峰图像(只能是灰度图像才有),就是图像的灰度统计图中可以明显看出只有两个波峰。

  • 相关代码:
import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread("D:\\software_my_programming\\\relate_to_irisrecog\\CASIA-Iris-Lamp\\001\\L\\S2001L01.jpg",0)#读取图像,0为灰度图像,1为彩色图像ret1,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)#简单滤波ret2,thresh2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)#Ostu滤波print(ret2)plt.subplot(221),plt.imshow(img,'gray')plt.subplot(222),plt.hist(img.ravel(),256)#该方法将矩阵转化为一维plt.subplot(223),plt.imshow(thresh1,'gray')plt.subplot(224),plt.imshow(thresh2,'gray')plt.show()

opencv_python阈值处理相关推荐

  1. opencv_python答题卡自动判卷

    opencv_python答题卡自动判卷 设定答题卡模板 该图像为答题卡的答题区域,黑色边框是为了能够在各种环境中轻易的检测,左部分和上部分的黑色矩形,是为能够定位到答题选项的坐标而设置,同时题目数量 ...

  2. 《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化

    6.7 阈值化 · 最简单的图像切割方法,剔除图像中像素高于或低于一定值的像素,用图像中每一个像素点的灰度值与选取的阈值进行比较,做出判断 · 涉及函数:Threshold()函数(基本阈值操作)和a ...

  3. cv2.threshold() 阈值:使用Python,OpenCV进行简单的图像分割

    图像分割有多种形式. 聚类.压缩.边缘检测.区域增长.图分区.分水岭等等:(Clustering. Compression. Edge detection. Region-growing. Graph ...

  4. cv2.threshholding()简单阈值、自适应阈值,Octus阈值

    @[TOC](cv2.threshholding()简单阈值.自适应阈值,Octus阈值 这篇博客将延续上一篇简单阈值处理,继续介绍自适应阈值及Octus阈值: 简单阈值详情见: https://bl ...

  5. 数字图像处理:blob分析、阈值分割

    1.Blob分析: 1.1.blob分析概念在计算机视觉中的Blob(Binary large object)是指图像中的具有相似颜色.纹理等特征所组成的一块连通区域,一般来说,该区域就是图像中的前景 ...

  6. OpenCV后投影,利用阈值函数分割指定区域生成掩膜,通过直方图分布查找其他图像相同区域。

    一.API函数 void mixChannels(const Mat* src,int nsrc,Mat* dst ,int ndst,const int* fromTo,size_t npairs) ...

  7. opencv阈值分割类型

    threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type); src:输入图,只能输入单通道图 ...

  8. harris角点检测与绘制。通过滑动滚动条来控制阈值,以控制检测角点的数量并返回角点坐标

    #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; ...

  9. 使用回调函数实现图像阈值分析。程序运行后在屏幕中输入阈值,通过改变滑动条实现不同类型的二值化图。

    #include<opencv2/opencv.hpp> #include<iostream> using namespace std; using namespace cv; ...

  10. OpenCV(十四)图像阈值

    目录 一.基础理论 1.二进制阈值化 2.反二进制阈值化 3.截断阈值化 4.阈值化为0 5.反阈值化为0 函数 代码 效果 参考答案 一.基础理论 在二维数字图像中,其每个像素点对应了不同的像素值, ...

最新文章

  1. 练习一下linux中的list函数。
  2. 英语和数学不好可以学python-学习Python总是学了新内容又忘了旧的咋办?
  3. Copy修饰的NSArray
  4. javafx显示image_JavaFX技巧20:有很多要显示的吗? 使用画布!
  5. Ajax补充之serialize
  6. itext 将pdf页面转成png_如何将PDF页面从横向改成纵向?
  7. mysql慢查询优化
  8. dockerfile 多端口映射 expose
  9. [转]深入Linux网络核心堆栈
  10. Java后台生成小程序二维码
  11. java 锯齿_Java2D图形抗锯齿
  12. 云安全架构连载之一-Azure整体架构及安全亮点详解
  13. java中 什么意思?比如130
  14. Processing创意编程(熟练篇)
  15. 找出给定字符串中大写字符(即'A'-'Z')的个数
  16. 机械臂抓取实验笔记总结
  17. chrome浏览器 各个版本下载地址
  18. 从零开发短视频电商 视频观看数、点赞数的优化
  19. Cris 学 SpringMVC(二):使用 servlet 原生 api 作为方法入参
  20. c# 中文数字转阿拉伯数字

热门文章

  1. [Unity]Mesh Baker3.1.0使用教程
  2. 存储单元,字,MAR,存储字长,存储字,存储容量
  3. Centos7部署Mantis
  4. 2021年茶艺师(中级)考试内容及茶艺师(中级)找解析
  5. 旅游产品分析:要出发周边游
  6. css制作三角形、带三角文本框、价格三角框
  7. Redis系列-生产应用篇-分布式锁(5)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-原子锁类
  8. android 进程通信
  9. 10 款富有创意的博客名片设计
  10. w3c怎么检测html5,HTML5教程:html标签属性通过w3c验证