首页 > 其他分享 >[2] 图像处理之----二值化处理

[2] 图像处理之----二值化处理

时间:2023-01-04 18:32:52浏览次数:67  
标签:plt img 阈值 cv2 ---- 图像处理 THRESH 二值化 255


文章目录

  • ​​1、什么是二值化处理​​
  • ​​2、为什么要进行二值化处理​​
  • ​​3、如何进行二值化处理​​
  • ​​(1)简单阈值​​
  • ​​(2)自适应阈值​​
  • ​​(3)Otsu's二值化​​
  • ​​4、参考文献:​​

1、什么是二值化处理

我们都知道,图像是由矩阵构成,矩阵中每个点的RGB值都不一样,呈现出来的色彩不一样,最终整体呈现给我们的就是一张彩色的图像。所谓”二值化处理“就是将矩阵中每个点的RGB值(0,0,0)[黑色]或者(255,255,255)[白色]



2、为什么要进行二值化处理

早期人们使用计算机处理图像是,实在图像灰度化处理的基础上在进行操作的,但是当时的硬件水平不足,所以处理速度很慢,于是人们引入了图像二值化处理。二值化处理使得原本颜色的取值范围从256种变为2种,确实是提高了计算速度,但是丢失的信息也多了,因此具体采用什么方式处理,要根据具体情况来选择。



3、如何进行二值化处理

(1)简单阈值

简单阈值是选取一个全局阈值,然后把整幅图像分成非黑即白的二值图像,灰度值大于阈值就赋为255反之为0。

ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINAR)

返回值一: 阈值,(Otsu‘s二值化会用到)
返回值二: 处理以后的图像
参数一: 初始图像
参数二:我们自己设定的阈值
参数三: 当图像像素置超过我们的设定的阈值时赋为255
参数四 : 我们设定的二值化类型

阈值

小于阈值

大于阈值

THRESH_BINARY

置0

置填充色

THRESH_BINARY_INV

置填充色

0

THRESH_TRUNC

保持原色

置灰色

THRESH_TOZERO

置0

保持原色

THRESH_TOZERO_INV

保持原色

置0

注:cv2.threshold最后一个参数可以写为0,1,2,3,4按顺序对应表格中的五种
代码如下

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('dog.jpeg', 0) # 直接读为灰度图像
ret, thresh1 = cv2.threshold(img, 127, 255, 0)
ret, thresh2 = cv2.threshold(img, 127, 255, 1)
ret, thresh3 = cv2.threshold(img, 127, 255, 2)
ret, thresh4 = cv2.threshold(img, 127, 255, 3)
ret, thresh5 = cv2.threshold(img, 127, 255, 4)
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] 图像处理之----二值化处理_二值化


注:将阈值大于127的像素值置为255

(2)自适应阈值

简单阈值的方式过于粗鲁,自适应阈值更趋向于局部性的阈值,也就是说,将像素点的像素值与该点所在的区域的像素值的平均值(最大值,中位数等)决定该店属于0还是1

th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,0,11,2)

返回值: 处理后返回的图像
参数一: 原始图像
参数二:像素值上限
参数三:自适应方法
— cv2.ADAPTIVE_THRESH_MEAN_C :领域内均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和
参数四:赋值方式(参考简单阈值中介绍的表格)
参数五:设定方阵的大小(因为是将一个点与其周围的方阵数据对比)
参数六:常数,每个区域计算出的阈值的基础上在减去这个常数作为这个区域的最终阈值,可以为负数




import cv2 as cv
import numpy as np


from matplotlib import pyplot as plt
img = cv.imread('dog.jpeg',0)
img = cv.medianBlur(img,5)

ret,th1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
th2 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_MEAN_C,0,11,2)
th3 = cv.adaptiveThreshold(img,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,0,11,2)

titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
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()



[2] 图像处理之----二值化处理_opencv_02

(3)Otsu’s二值化

对于简单阈值,cv2.threshold()的第二个参数是我们自己设定的阈值范围,一张图片的最好的阈值分界线不是凭感觉看出来的,而是有合理的方式能找到的,threshold的第一个返回值就是处理图片的阈值分界线。因此,只要在threshold函数的最后一个参数在原有的基础上加上’cv2.THRESH_OTSU‘那么第一个返回值就是最佳阈值。直接看代码更好理解。
注:OTSU非常适合灰度直方图具有双峰值的情况

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('cat.jpg', 0) # 直接读为灰度图像
# 简单滤波
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
print(ret1)
# Otsu 滤波
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
print(ret2)

plt.figure()
plt.subplot(221), plt.imshow(img,'gray')
plt.subplot(222), plt.hist(img.ravel(), 256) # .ravel方法将矩阵转化为一维
plt.subplot(223), plt.imshow(th1,'gray')
plt.subplot(224), plt.imshow(th2,'gray')
plt.show()

[2] 图像处理之----二值化处理_opencv_03

4、参考文献:

​https://numpy.org/doc/stable/reference/generated/numpy.hstack.html​​​​ https://zhuanlan.zhihu.com/p/360824614​​​

声明:部分图像源自网络,本文仅供学习交流使用,如果不妥,请联系删除。


标签:plt,img,阈值,cv2,----,图像处理,THRESH,二值化,255
From: https://blog.51cto.com/u_14597003/5989185

相关文章

  • JAVA-上转型对象,下转型对象
    packagecom.example.barry;//父类publicclassparents{publicparents(){}publicvoidsay(){System.out.println("我是家长");}publicvoi......
  • 图像处理-图像滤波
    文章目录​​1、图像滤波​​​​2、各滤波特点​​​​2.1均值滤波​​​​2.2高斯滤波​​​​2.3中值滤波​​​​3、案例分析​​​​3.1均值滤波​​​​3.1.1代码......
  • (15)Python识别文字,tesseract包
    使用python提供的tesseract包识别图片中的文字,但效果一般我的是在arch中实现的文章目录​​1、安装tesseract和英文和中文语言包​​​​2、安装必要的第三方库​​​​3、......
  • 图像处理-直方图均衡化
    文章目录​​1、直方图均衡化​​​​1.1什么是直方图均衡化​​​​1.2为什么要进行直方图均衡化​​​​1.3怎样进行直方图均衡化​​​​2、案例分析​​​​2.1代码......
  • (1)信息熵,条件熵,信息增益,信息增益率
    介绍信息熵和信息增益之前,先介绍信息增量的概念文章目录​​1、信息量​​​​2、信息熵​​​​3、信息熵冗余度​​​​4、条件熵​​​​5、信息增益​​​​6、信息增益......
  • Dev-c++下‘stoi‘ was not declared in this scope解决办法
    打开“工具”->“编译选项”选择“代码生成/优化”,设置成以下形式即可......
  • Typora下载安装教程
    typora是一款非常好用的Markdown编辑器和阅读器,相信做技术的的同学都不陌生,其具有小巧、快速、实时预览等特点,是一款提升生产力的工具。下载typora安装包&pojie包下载:关......
  • 【转载】SRS、EasyDarwin、ZLMediaKit、Monibuca对比分析
    声明转自liuzhen007的《SRS、EasyDarwin、ZLMediaKit、Monibuca对比分析》作者:liuzhen007链接:https://juejin.cn/post/6926739029496954888来源:稀土掘金著作权归作......
  • JVM 如何获取当前容器的资源限制?
    作者:卜比本文是《容器中的Java》系列文章之1/n,欢迎关注后续连载......
  • 浅拷贝与深拷贝
    相互关联用浅拷贝,不关联就用深拷贝。深拷贝和浅拷贝是指在赋值一个对象时,拷贝的深度不同。在进行深拷贝时,会拷贝所有的属性,并且如果这些属性是对象,也会对这些对象进行深......