opencv(20) 图像阈值(二值化)

这篇具有很好参考价值的文章主要介绍了opencv(20) 图像阈值(二值化)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 图像二值化原理

二值化核心思想,设阈值,大于阈值的为0(黑色)或 255(白色),使图像称为黑白图。

阈值可固定,也可以自适应阈值。

自适应阈值一般为一点像素与这点为中序的区域像素平均值或者高斯分布加权和的比较,其中可以设置一个差值也可以不设置。

图像的阈值化旨在提取图像中的目标物体,将背景以及噪声区分开来。通常会设定一个阈值T,通过T将图像的像素分为两类:大于T的像素群和小于T的像素群。

灰度转换处理后的图像中,每个像素都只有一个灰度值,其大小表示明暗程度。所谓图像的二值化 ,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体。

常用的二值化算法下所示:

opencv 二值化处理,opencv,计算机视觉,图像处理

当灰度Gray小于阈值T的时候,其像素设置为0,表示黑色;当灰度Gray大于或等于阈值T时,其Y值为255,表示白色。

全局阈值就是一幅图像包括目标物体、背景还有噪声,要想从多值的数字图像中直接提取出目标物体;常用的方法就是设定一个阈值T,用T将图像的数据分成两部分:大于T的像素群和小于T的像素群。这是研究灰度变换的最特殊的方法,称为图像的二值化(Binarization)。

局部阈值就是当同一幅图像上的不同部分的具有不同亮度时。这种情况下我们需要采用自适应阈值。此时的阈值是根据图像上的每一个小区域计算与其对应的阈值。因此在同一幅图像上的不同区域采用的是不同的阈值,从而使我们能在亮度不同的情况下得到更好的结果。

二值化处理广泛应用于各行各业,比如生物学中的细胞图分割,交通领域的车牌设计等。在文化应用领域中,通过二值化处理将所需民族文物图像转换为黑白两色图,从而为后面的图像识别提供更好的支撑作用。

2 cv2.threshold() 简单阈值处理(全局阈值)

原型:

ret,dist=threshold(src, thresh, maxval, type, dst=None)

参数:

  1. src  指原图像,原图像应该是灰度图,只能输入单通道图像
  2. thresh  指用来对像素值进行分类的阈值
  3. maxval 指当像素值高于(有时是小于,根据 type 来决定)阈值时应该被赋予的新的像素值,在二元阈值THRESH_BINARY和逆二元阈值THRESH_BINARY_INV中使用的最大值 
  4. dst 输出图
  5. type 指不同的不同的阈值方法,这些方法包括以下五种类型(0,1,2,3,4):

 不同的阈值方法

cv2.THRESH_BINARY      二进制阈值化

超过阈值部分取 maxval(最大值),否则取 0

                 opencv 二值化处理,opencv,计算机视觉,图像处理

在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。

opencv 二值化处理,opencv,计算机视觉,图像处理

cv2.THRESH_BINARY_INV   反二进制阈值化

                 opencv 二值化处理,opencv,计算机视觉,图像处理

该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。

opencv 二值化处理,opencv,计算机视觉,图像处理

cv2.THRESH_TRUNC   截断阈值化,大于阈值部分设为阈值,否则不变

                  opencv 二值化处理,opencv,计算机视觉,图像处理

同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。

opencv 二值化处理,opencv,计算机视觉,图像处理cv2.THRESH_TOZERO     阈值化为零,大于阈值部分不改变,否则设为零

distx,y=src(x,y),   if srcx,y>thresh0,             otherwise                  opencv 二值化处理,opencv,计算机视觉,图像处理

先选定一个阈值,然后对图像做如下处理:1 像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。

opencv 二值化处理,opencv,计算机视觉,图像处理

cv2.THRESH_TOZERO_INV   反阈值化为零

                opencv 二值化处理,opencv,计算机视觉,图像处理

原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。

opencv 二值化处理,opencv,计算机视觉,图像处理

示例

# _*_coding:utf-8_*_
import cv2
import numpy as np
from matplotlib import pyplot as plt
 
def parse_thresh(path):
    imgCV = cv2.imread(path)  # 读取原始照片
    img =cv2.merge((imgCV[:,:,2],imgCV[:,:,1],imgCV[:,:,0]))
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    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 = ['Origin Image', 'gray', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']  # 标题
    images = [img, gray, thresh1, thresh2, thresh3, thresh4, thresh5]  # 对应的图
    
    plt.figure(figsize=(20,6.4))
    for i in range(7):  # 画7次图
        plt.subplot(2, 4, i + 1), plt.imshow(images[i], 'gray')
        plt.title(titles[i],fontsize=30)
        plt.xticks([]), plt.yticks([])
 
    plt.show()
 
 
if __name__ == '__main__':
    path = 'C:\\Users\\xxx\\Downloads\\picture1.jpeg'
    parse_thresh(path)

 运行结果如下:

opencv 二值化处理,opencv,计算机视觉,图像处理

3 cv2.adaptiveThreshold()自适应阈值处理(局部阈值)

原型:

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, param1, dst=None)

参数:

  1. 第一个参数 src 指原图像,原图像应该是灰度图。
  2. 第二个参数 x 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
  3. 第三个参数 adaptive_method 参数为:CV_ADAPTIVE_THRESH_MEAN_C、CV_ADAPTIVE_THRESH_GAUSSIAN_C
  4. 第四个参数 threshold_type 指取阈值类型。必须是下者之一:CV_THRESH_BINARY、CV_THRESH_BINARY_INV
  5. 第五个参数 block_size 指用来计算阈值的象素邻域大小: 3, 5, 7, …
  6. 第六个参数 param1 指与方法有关的参数。对CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一个从均值或加权均值提取的常数, 尽管它可以是负数;对方法CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1;对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1。

示例

import cv2
from matplotlib import pyplot as plt
#详细说明参考2例子
 
img = cv2.imread('C:\\Users\\liyou\\Downloads\\picture1.jpeg',0)
img = cv2.medianBlur(img,5)
 
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
 
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
            cv2.THRESH_BINARY,11,2)
 
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
            cv2.THRESH_BINARY,11,2)
 
titles = ['Original Image', 'Global Thresholding (v = 127)',
            'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]

plt.figure(figsize=(32,4.8))
for i in range(4):
    plt.subplot(1,4,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i],fontsize=24)
    plt.xticks([]),plt.yticks([])
plt.show()

 运行结果如下:

opencv 二值化处理,opencv,计算机视觉,图像处理

4 Qtsu二值化

在使用全局阈值时,我们就是随便给了一个数来做阈值,那我们怎么知道我们选取的这个数的好坏呢?答案就是不停的尝试。如果是一副双峰图像(简单来说双峰图像是指图像直方图中存在两个峰)呢?我们岂不是应该在两个峰之间的峰谷选一个值作为阈值?这就是 Otsu 二值化要做的。简单来说就是对一副双峰图像自动根据其直方图计算出一个阈值。(对于非双峰图像,这种方法得到的结果可能会不理想)。

这里用到到的函数还是 cv2.threshold(),但是需要多传入一个参数(flag):cv2.THRESH_OTSU

这时要把阈值设为 0。然后算法会找到最优阈值,这个最优阈值就是返回值 retVal。如果不使用 Otsu 二值化,返回的retVal 值与设定的阈值相等。

示例

下面的例子中,输入图像是一副带有噪声的图像。第一种方法,设127 为全局阈值。第二种方法,直接使用 Otsu 二值化。第三种方法,先使用一个 5x5 的高斯核除去噪音,然后再使用 Otsu 二值化。

import cv2
from matplotlib import pyplot as plt
 
img = cv2.imread('C:\\Users\\liyou\\Downloads\\picture1.jpeg',0)
 
# 设127 为全局阈值
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
 
# 直接使用 Otsu 二值化
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
 
# 先使用一个 5x5 的高斯核除去噪音,然后再使用 Otsu 二值化
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
 
 
images = [img, 0, th1,
          img, 0, th2,
          blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
          'Original Noisy Image','Histogram',"Otsu's Thresholding",
          'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
plt.figure(figsize=(19.2,14.4))
for i in range(3):
    plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
    plt.title(titles[i*3],fontsize=30), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
    plt.title(titles[i*3+1],fontsize=30), plt.xticks([]), plt.yticks([])
    plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
    plt.title(titles[i*3+2],fontsize=30), plt.xticks([]), plt.yticks([])
plt.show()

 运行后,结果如下:

opencv 二值化处理,opencv,计算机视觉,图像处理文章来源地址https://www.toymoban.com/news/detail-786514.html

到了这里,关于opencv(20) 图像阈值(二值化)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于opencv的c++图像处理(图像二值化)

    基于opencv的c++接口,实现常用的图像二值化方法,包括了最大类间方差法(OTSU)、固定化阈值以及自适应阈值。 该函数将固定级别的阈值应用于多通道阵列。该函数通常用于从灰度图像中获取双层(二进制)图像(#compare 也可用于此目的)或用于去除噪声,即过滤掉值过小

    2024年02月07日
    浏览(34)
  • OpenCV常用功能——灰度处理和图像二值化处理

    1.1 cvtColor函数 函数原型: 功能 :转换图像颜色空间。 参数 : src: 输入图像。 code: 颜色空间转换代码。可以取常量cv2.COLOR_BGR2GRAY或cv2.COLOR_RGB2GRAY。 dst: 输出图像。 dstCn: 输出图像的通道数,如果设置为0,则跟随转换代码自动设置。 内置函数示例代码: 灰度处理的原理是将

    2024年02月08日
    浏览(47)
  • 【OpenCV】 基础入门(二)图像基础概念 | 图像灰度化处理 | 图像二值化处理

      在计算机中用一般用 M x N 的矩阵来表示一幅尺寸大小为 M x N 的数字图像,矩阵元素的值就是该图像对应位置上的像素值。    对于计算机本地磁盘中的彩色图像,单机鼠标右键,选择“属性”,可以看到一幅图像的基本信息。 1、灰度图:   灰度图是每个像素只有一

    2024年04月14日
    浏览(37)
  • C#使用OpenCv(OpenCVSharp)图像局部二值化处理实例

      本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行局部二值化处理。 目录 图像二值化原理 局部二值化 自适应阈值 实例 效果

    2024年02月13日
    浏览(38)
  • C#使用OpenCv(OpenCVSharp)图像全局二值化处理实例

    本文实例演示C#语言中如何使用OpenCv(OpenCVSharp)对图像进行全局二值化处理。 目录 图像二值化原理 函数原型 参数说明 实例 效果

    2024年02月13日
    浏览(34)
  • 图像二值化阈值调整——cv2.threshold方法

    二值化阈值调整:调整是指在进行图像二值化处理时,调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限,大于阈值的像素被设置为白色,小于等于阈值的像素被设置为黑色。 首先画出灰度直方图:横坐标是灰度值0—255,纵坐标是该灰度值的像素个数。 方

    2024年02月06日
    浏览(41)
  • OpenCV-Python学习(10)—— OpenCV 图像二值化处理(cv.threshold)

    1. 学习目标 理解图像的分类,不同类型的图像的区别; 对图像进行二值化处理,对【 cv.threshold 】函数的理解。 2. 图像分类 2.1 不同类型图像说明 按照颜色对图像进行分类,可以分为二值图像、灰度图像和彩色图像。 二值图像: 只有黑色和白色两种颜色的图像。 每个像素

    2024年02月03日
    浏览(39)
  • 基于FPGA的图像自适应阈值二值化算法实现,包括tb测试文件和MATLAB辅助验证

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1Otsu方法 4.2 Adaptive Thresholding方法 4.3、FPGA实现过程 5.算法完整程序工程 Vivado2019.2 matlab2022a        图像二值化是数字图像处理中的一种常见技术,可以将灰度图像转换为黑白二值图像,突出图像

    2024年02月08日
    浏览(36)
  • OpenCV(八):图像二值化

    目录 1.固定值二值化 2.自适应阈值二值化 3.Android JNI完整代码 1.固定值二值化 固定阈值二值化是OpenCV中一种简单而常用的图像处理技术,用于将图像转换为二值图像。在固定阈值二值化中,像素值根据一个预定义的阈值进行分类,大于阈值的像素被设置为白色,而小于或等于

    2024年02月10日
    浏览(36)
  • [2] 图像处理之----二值化处理

    简单阈值是选取一个全局阈值,然后把整幅图像分成非黑即白的二值图像,灰度值大于阈值就赋为255反之为0。 ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINAR) 返回值一: 阈值,(Otsu‘s二值化会用到) 返回值二: 处理以后的图像 参数一: 初始图像 参数二:我们自己设定的阈

    2024年02月05日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包