图像二值化 订阅
图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。 展开全文
图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
信息
外文名
Image Binarization
灰度值
0或255
实现函数
OpenCV,matlab
释    义
将整个图像呈现出明显的黑白效果
中文名
图像二值化
算    法
OTSU,Kittle
图像二值化简介
将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,首先,图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。其次,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像。所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。
收起全文
精华内容
下载资源
问答
  • 图像二值化

    千次阅读 2020-02-11 14:00:03
    什么是图像二值化 彩色图像: 有blue,green,red三个通道,取值范围均为0-255 灰度图:只有一个通道0-255,所以一共有256种颜色 二值图像:只有两种颜色,黑色和白色 图像二值化 图像二值化的步骤 获取阈值 根据...

    什么是图像二值化

    彩色图像: 有blue,green,red三个通道,取值范围均为0-255

    灰度图:只有一个通道0-255,所以一共有256种颜色

    二值图像:只有两种颜色,黑色和白色

    图像二值化

    图像二值化的步骤

    • 获取阈值
      在这里插入图片描述
    • 根据阈值去二值化图像

    Opencv二值化的方法及代码

    全局阈值

    OpenCv的threshold函数进行全局阈值。
    其函数原型为:cv.threshold(src, thresh, maxval, type[, dst]) -> retval, dst
    src:表示输入图像(多通道,8位或32位浮点)。
    thresh:表示阈值。
    maxval:与THRESH_BINARY和THRESH_BINARY_INV阈值类型一起使用设置的最大值。
    type: 阈值类型。
    retval: 返回的阈值。若是全局固定阈值算法,则返回thresh参数值。若是全局自适应阈值算法,则返回自适应计算得出的合适阈值。
    dst: 输出与src相同大小和类型以及相同通道数的图像。
    
    阈值的类型

    原灰度图像的像素值(其中红色的线表示阈值,折线表示像素值)
    在这里插入图片描述

    • THRESH_BINARY:超过阈值的值为最大值,其他值是0
      在这里插入图片描述
    • THRESH_BINARY_INV:超过阈值的值为0,其他值为最大值
      在这里插入图片描述
    • THRESH_TRUNC: 超过阈值的值等于阈值,其他值不变
      在这里插入图片描述
    • THRESH_TOZERO: 超过阈值的值不变,其他值为0
      在这里插入图片描述
    • THRESH_TOZERO_INV:超过阈值的值为0,其他值不变
      在这里插入图片描述
    代码实现
    • 全局阈值使用THRESH_OTSU大津法
    def threshold_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)   ##要二值化图像,必须先将图像转为灰度图
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
        print("threshold value %s" % ret)  #打印阈值,超过阈值显示为白色,低于该阈值显示为黑色
        cv.imshow("threshold", binary) #显示二值化图像
    

    在这里插入图片描述
    threshold value 137.0 #获取阈值为137

    • 全局阈值使用THRESH_TRIANGLE 三角形算法
    def threshold_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY|cv.THRESH_TRIANGLE)
        print("threshold value %s" % ret)
        cv.imshow("threshold", binary)
    

    在这里插入图片描述

    threshold value 105.0
    

    知识补充:
    cv.THRESH_OTSU和cv.THRESH_TRAINGLE都是自动获取阈值
    THRESH_OTSU:适用于双波峰
    THRESH_TRIANGLE:适用于单个波峰,最开始用于医学分割细胞等

    • 全局阈值 自己手动设定阈值
      (1)THRESH_BINARY_INV大于阈值的都为0
    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY)
    

    在这里插入图片描述
    (2)THRESH_TRUNC截断大于127的值都为127,其他值不变

    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TRUNC)
    

    在这里插入图片描述
    (3)THRESH_TOZERO 超过阈值的值不变,小于阈值的为0

    ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_TOZERO)
    

    在这里插入图片描述

    局部阈值

    可以使图片更加清晰

    OpenCV的adaptiveThreshold函数进行局部阈值。函数原型为:adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
    src:输入图像(8位单通道图像)。
    maxValue:使用 THRESH_BINARY 和 THRESH_BINARY_INV 的最大值.
    adaptiveMethod参数表示自适应阈值算法,平均 (ADAPTIVE_THRESH_MEAN_C)或高斯(ADAPTIVE_THRESH_GAUSSIAN_C)。
    thresholdType:阈值类型,必须为THRESH_BINARY或THRESH_BINARY_INV的阈值类型。
    blockSize: 块大小(奇数且大于1,比如3,5,7........ )。
    C: 常数,表示从平均值或加权平均值中减去的数。 通常情况下,这是正值,但也可能为零或负值
    

    在使用平均和高斯两种算法情况下,通过计算每个像素周围blockSize x blockSize大小像素块的加权均值并减去常量C即可得到自适应阈值。
    如果使用平均的方法,则所有像素周围的权值相同;
    如果使用高斯的方法,则每个像素周围像素的权值则根据其到中心点的距离通过高斯方程得到

    def adaptive_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10)
        cv.imshow("binary", binary)
    

    在这里插入图片描述

    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)
    

    在这里插入图片描述

    全局和局部阈值比较在这里插入图片描述

    自己计算阈值

    def custom_demo(image):
        gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
        h, w = gray.shape[:2]
        m = np.reshape(gray, [1, h*w]) #将图像转为1行h*w列
        mean = m.sum() / (h*w)  #计算图像的均值,用均值作为阈值,来分割图像
        ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
        print("threshold value %s" % ret)
        cv.imshow("cudtom_binary", binary)
    

    在这里插入图片描述

    threshold value 107.0
    

    知识补充:
    np.reshpe是给数组一个新的形状而不改变其数据,
    函数原型:reshape(a, newshape, order=‘C’)

    a参数表示需要重新形成的原始数组。
    newshape参数表示int或int类型元组(tuple),若为(1, 3),表示生成的新数组是1行3列。
    order参数表表示使用此索引顺序读取a的元素,并使用此索引顺序将元素放置到重新形成的数组中。
    函数返回值:如果可能的话,这将是一个新的视图对象; 否则,它会成为副本。

    注意:将图像转一维数组,转换维度要保证图像的size不变,newshape=[行,列]

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,973
精华内容 3,589
关键字:

图像二值化