精华内容
下载资源
问答
  • 图像二值化图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。图像的...

    0x00. 图像二值化

    图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。

    将256个亮度等级的灰度图像通过适当的阈值选取而获得仍然可以反映图像整体和局部特征的二值化图像。

    图像的二值化有利于图像的进一步处理,使图像变得简单,而且数据量减小,能凸显出感兴趣的目标的轮廓。

    0x01. 图像二值化处理

    在将图像二值化之前需要将其先灰度化,示例代码:

    import cv2.cv as cv

    image = cv.LoadImage('mao.jpg')

    new = cv.CreateImage(cv.GetSize(image), image.depth, 1)

    for i in range(image.height):

    for j in range(image.width):

    new[i,j] = max(image[i,j][0], image[i,j][1], image[i,j][2])

    cv.Threshold(new, new, 10, 255, cv.CV_THRESH_BINARY_INV)

    cv.ShowImage('a_window', new)

    cv.WaitKey(0)

    0x02. cv.Threshold

    cv.Threshold(src, dst, threshold, maxValue, thresholdType)

    函数 cvThreshold 对单通道数组应用固定阈值操作。

    该函数的典型应用是对灰度图像进行阈值操作得到二值图像。

    参数说明:

    src:原始数组 (单通道 , 8-bit of 32-bit 浮点数)。

    dst:输出数组,必须与 src 的类型一致,或者为 8-bit。

    threshold:阈值

    maxValue:使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

    threshold_type:阈值类型

    threshold_type=CV_THRESH_BINARY:

    如果 src(x,y)>threshold ,dst(x,y) = max_value; 否则,dst(x,y)=0;

    threshold_type=CV_THRESH_BINARY_INV:

    如果 src(x,y)>threshold,dst(x,y) = 0; 否则,dst(x,y) = max_value.

    threshold_type=CV_THRESH_TRUNC:

    如果 src(x,y)>threshold,dst(x,y) = max_value; 否则dst(x,y) = src(x,y).

    threshold_type=CV_THRESH_TOZERO:

    如果src(x,y)>threshold,dst(x,y) = src(x,y) ; 否则 dst(x,y) = 0.

    threshold_type=CV_THRESH_TOZERO_INV:如果 src(x,y)>threshold,dst(x,y) = 0 ; 否则dst(x,y) = src(x,y).

    对灰度图像利用阈值得到一个二值化的图像,是常最常用的图像处理技术之一。例如,灰度大于127的图像设置为1、小于127的设置为0,这种处理便是固定阈值127的二值化处理。

    自适应的二值化处理不同于固定阈值的处理,每个像素的阈值依赖于其邻近的像素灰度,为了得到(x,y)点的阈值T(x,y),我们需要进行以下处理。

    在此像素周边选取一个bxb的区域,其中了是用户指定的。

    计算此bxb区域的加权平均值。OpenCV提供了两种方法计算此加权均值,一种是算术平均法,另一种是高斯加权平均法,后者要计算均值时距离区域中心越近权重越大。我们将得到的加权均值计为WA(x,y)

    将上述加权均值与一固定参数相减得到阈值T(x,y),此固定参数设为param1,则(x,y)点的阈值可以用下式进行计算: T(x,y)=WA(x,y)-param1

    这便是得到阈值的过程,下面我们在利用OpenCV库编程实现固定阈值和自适应阈值的方法,我将在IPython环境下实现。

    导入必要的模块1

    2

    1

    2

    读取图像

    读取图像,并把图像转换为灰度图像并显示之。1

    2

    3

    4

    5

    6

    1

    2

    3

    4

    5

    6

    固定阈值二值化

    我们首先进行固定阈值二值化处理,固定阈值二值化处理利用cv2.threshold函数,此函数的原型为:1

    1

    其中:

    src 为输入图像;

    thresh 为阈值;

    maxval 为输出图像的最大值;

    type 为阈值的类型;

    dst 为目标图像。

    此例中我们将阈值设置为50,阈值类型为cv2.THRESH_BINARY,则灰度在大于50的像素其值将设置为255,其它像素设置为0。1

    2

    3

    4

    5

    1

    2

    3

    4

    5

    效果如下:

    算术平法的自适应二值化

    算术平均法的自适应二值化利用cv2.adaptiveThreshold实现,此函数的原型为:1

    1

    其中:

    src 为输入图像;

    maxval 为输出图像的最大值;

    adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;

    thresholdType: 阈值的类型;

    blockSize: b的值;

    C 为从均值中减去的常数,用于得到阈值;

    dst 为目标图像。

    此例中我们将b设置为5,常数设置为10。1

    2

    3

    4

    5

    1

    2

    3

    4

    5

    得到的结果如下图所示:

    高斯加权均值法自适应二值化

    高斯加权均值法自适应二值化也是利用cv2.adaptiveThreshold, 此函数的原型与上述相同:1

    1

    其中:

    src 为输入图像;

    maxval 为输出图像的最大值;

    adaptiveMethod 设置为cv2.ADAPTIVE_THRESH_MEAN_C表示利用算术均值法,设置为cv2.ADAPTIVE_THRESH_GAUSSIAN_C表示用高斯权重均值法;

    thresholdType: 阈值的类型;

    blockSize: b的值;

    C 为从均值中减去的常数,用于得到阈值;

    dst 为目标图像。1

    2

    3

    4

    5

    1

    2

    3

    4

    5

    处理结果如下:

    就这么简单,显然自适应方法要比固定阈值的方法效果更好。%pylab

    import cv2im = 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()cv2.threshold(src, thresh, maxval, type[, dst]) -> retval, dstretval, im_at_fixed = cv2.threshold(im_gray, 50, 255, cv2.THRESH_BINARY)

    axis("off")

    title("Fixed Thresholding")

    imshow(im_at_fixed, cmap = 'gray')

    show()cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dstim_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()cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dstim_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()

    展开全文
  • python中二值化图像的方法发布时间:2020-07-16 09:12:17

    python中二值化图像的方法

    发布时间:2020-07-16 09:12:17

    展开全文
  • 算法核心:找阈值!!!参考文章:http://www.cnblogs.com/ssyfj/p/9272615.html#二全局阈值使用... 局部自适应二值化采用了分块,效果比全局二值化只采用了一种threshold这种,效果要好很多二. 全局二值化算法:1...

    算法核心:找阈值!!!

    参考文章:http://www.cnblogs.com/ssyfj/p/9272615.html#二全局阈值使用thresh_triangle三角形算法

    https://www.cnblogs.com/xiaomanon/p/4110006.html(重要)

    一. 局部自适应二值化采用了分块,效果比全局二值化只采用了一种threshold这种,效果要好很多

    二. 全局二值化算法:

    1.OTSU算法(大津法或最大类间方差法)是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法

    ① Otsu最大类间方差法原理

    利用阈值将原图像分成前景,背景两个图象。

    前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度

    后景:用n2, sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度

    当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准,而在otsu算法中这个衡量差别的标准就是最大类间方差,在本程序中类间方差用sb表示,最大类间方差用fmax

    ②关于最大类间方差法(otsu)的性能:

    类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。

    当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。

    ③最大类间方差法(otsu)的公式推导:

    记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。

    则图像的总平均灰度为:u=w0*u0+w1*u1。

    前景和背景图象的方差:g=w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u)=w0*w1*(u0-u1)*(u0-u1),此公式为方差公式。

    可参照概率论课本上面的g的公式也就是下面程序中的sb的表达式。当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度t是最佳阈值sb = w0*w1*(u1-u0)*(u0-u1)

    2.三角形法

    ①三角法求阈值最早见于Zack的论文《Automatic measurement of sister chromatid exchange frequency》,主要是用于染色体的研究,该方法是使用直方图数据,基于纯几何方法来寻找最佳阈值,它的成立条件是假设直方图最大波峰在靠近最亮的一侧,然后通过三角形求得最大直线距离,根据最大直线距离对应的直方图灰度等级即为分割阈值,图示如下:

    对上图的详细解释:

    在直方图上从最高峰处bmx到最暗对应直方图bmin(p=0)%构造一条直线,从bmin处开始计算每个对应的直方图b到直线的垂直距离,直到bmax为止,其中最大距离对应的直方图位置即为图像二值化对应的阈值T。

    扩展情况:

    有时候最大波峰对应位置不在直方图最亮一侧,而在暗的一侧,这样就需要翻转直方图,翻转之后求得值,用255减去即得到为阈值T。扩展情况的直方图表示如下:

    ②算法步骤

    1. 图像转灰度

    2. 计算图像灰度直方图

    3. 寻找直方图中两侧边界

    4. 寻找直方图最大值

    5. 检测是否最大波峰在亮的一侧,否则翻转

    6. 计算阈值得到阈值T,如果翻转则255-T

    3. 高斯混合分布的全局阈值算法

    本程序的原理很简单:如下图所示,蓝色的代表一个灰度图片的直方图,想办法找到一个合适的混合高斯分布去逼近它。混合高斯分布,其实就是两个高斯分布之和。我们认为两个高斯分布相交的地方的灰度值,就是要选择的阈值。

    那么怎么去寻找一个逼近它的高斯分布呢?我用的是一个比较笨的方法,取一个变量t,将这个变量t,从左到右遍历每一个灰度。每次以t左边的数据当成一组样本来估计一个高斯分布,以t右边的数据为另一个样本来估计第二个高斯分布。将这两个高斯分布组合成的混合高斯分布,跟原始的数据匹配。至于匹配标准可以随意选择,可以用最小均方误差,也可以用最小绝对值误差,也可以用相关程度。随着t的遍历,找到每一次混合高斯分布与原始数据的匹配程度,选择最为匹配的混合高斯分布所对应的t值值为阈值。

    实践证明,这种方法的自适应性还是很好的,鲁棒性比较好。

    当改变直方图时,混合高斯模型的匹配效果,还是很多不错的。

    但是有一点,就是要求处理的图片,灰度不能太复杂,尽量符合混合高斯模型。

    三. 局部自适应二值化:

    1.平均值算法

    2.高斯自适应法   参考:https://blog.csdn.net/d14665/article/details/41990481

    二值化原理:

    把一个灰度图像二值化,其实就是找到一个阈值,使这个较低中,灰度大于这个阈值的,设置成255,灰度小于这个阈值的,设置为0。

    阈值自适应二值化:

    非自适应的二值化呢,有一个问题,就是一个阈值往往只对应一类图像,如果图像的光照变暗了,那个单阈值情况的二值化效果会大大的折扣。

    自适应二值化其实就是一种根据图片的灰度直方图,得到一个适合本图像的二值化阈值。

    代码如下:

    import numpy as np

    import cv2 as cv

    import matplotlib.pyplot as plt

    def global_threshold_demo(image):

    '''二值化'''

    #1.灰度化

    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)

    #2.计算直方图

    hist=cv.calcHist([gray],[0],None,[256],[0,256])

    plt.plot(hist)

    plt.xlim([0, 256])

    plt.show()

    #二值化,ret代表阈值,binary是二值图像

    #cv.THRESH_OTSU,cv.THRESH_TRIANGLE 计算阈值的方法,加上竖线,自动寻找阈值

    # ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU)#ret:阈值,binary:二值图像

    # ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE) # ret:阈值,binary:二值图像

    # ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_BINARY) # 手工指定阈值:100,去掉自动寻找阈值

    # ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_BINARY_INV) #100,取反

    # ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_TRUNC) #100,取截断,>100的全部变成100

    ret, binary = cv.threshold(gray, 100, 255, cv.THRESH_TOZERO) #100,<100的全部变成0

    print('ret:',ret)

    # cv.imshow('gray',gray)

    cv.imshow('binary', binary)

    def local_threshold_demo(image):

    '''局部自适应二值化'''

    gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)

    #pram:[gray,max_value,local_binary_method,binary_method,blocksize:奇数必须,value-mean>10?white:black]

    # dst=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,cv.THRESH_BINARY,25,10)#means_c方法,采用对区域内的像素进行均值加权计算

    dst=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)#GAUSSIAN_C方法,采用高斯,区域中的(x,y)周围的像素根据高斯函数按照它们离中心点的距离进行加权计算

    cv.imshow('local_binary',dst)

    src=cv.imread('D:/opencv/meinv.jpg')

    cv.imshow('src',src)

    # global_threshold_demo(src)#全局二值化

    local_threshold_demo(src)#局部二值化

    cv.waitKey(0)

    cv.destroyAllWindows()

    展开全文
  • 这篇文章主要介绍了python图片二值化提高识别率代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下代码如下import cv2from PIL import Imagefrom ...

    这篇文章主要介绍了python图片二值化提高识别率代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    代码如下

    import cv2from PIL import Imagefrom pytesseract import pytesseractfrom PIL import ImageEnhanceimport reimport string

    def createFile(filePath,newFilePath):

    img = Image.open(filePath)

    # 模式L”为灰色图像,它的每个像素用8个bit表示,0表示黑,255表示白,其他数字表示不同的灰度。

    Img = img.convert('L')

    Img.save(newFilePath)

    # 自定义灰度界限,大于这个值为黑色,小于这个值为白色

    threshold = 200

    table = []

    for i in range(256):

    if i < threshold:

    table.append(0)

    else:

    table.append(1)

    # 图片二值化

    photo = Img.point(table, '1')

    photo.save(newFilePath)

    if __name__ == '__main__':

    createFile(r'1.bmp',r'newTest.png')

    原图:

    处理过后的图:

    识别结果:

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 在用python进行图像处理时,二值化是非常重点的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新版的方法会继续增加)。1. opencv 简单阈值 cv2.threshold2. opencv ...
  • 在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增)。1. opencv 简单阈值 cv2.threshold2. opencv 自适应...
  • 在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增)。1. opencv 简单阈值 cv2.threshold2. opencv 自适应...
  • https://blog.csdn.net/qq_35531549/article/details/96134760# 识别前处理# 图片二值化from PIL import Imageimport osos.chdir('D:\OCR')img = Image.open('test.png')# 模式L”为灰色图像,它的每个像素用8个bit...
  • 在用python进行图像处理时,二值化是非常重要的一步,现总结了自己遇到过的6种 图像二值化的方法(当然这个绝对不是全部的二值化方法,若发现新的方法会继续新增)。1. opencv 简单阈值 cv2.threshold2. opencv 自适应...
  • 图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓二值...
  • 二值化之后,通过百度的图片识别接口还是无法识别验证码。请教各位大神,二值化该如何操作。from PIL import Imageimg = Image.open('c.png') # 读入图片img = img.convert("RGBA")pixdata = img.load()#二值化for y...
  • 任务要求:自定义一个层主要是定义该层的实现函数,只需要重载Function的forward和backward函数即可,如下:import torchfrom torch.autograd import Functionfrom torch.autograd import Variable定义二值化函数class ...
  • 请教一下各位大佬,我现在要对一批图片进行二值化处理。但是问题在于,这一批图片里有的图片已经二值化处理过了。 而且这些处理过的图片有的是黑底白字,有的是白底黑字,请问该如何将他们归一化到白底黑字/黑底...
  • 本来是个很简单的分类问题,但是最后输出后却发现不仅仅是0和255两种像素类型,后来思考后才发现他输出的是类似于置信度的东西,具体的我还没有完全明白,但是越白的像素说明他越可能接近白这一类,越黑的就越...
  • 在对图像处理时有需要对图像进行细化... Xihua) for i in range(10): VThin(Xihua, array) HThin(Xihua, array) cv2.imshow("xihua", Xihua) cv2.waitKey() 运行结果:002.tif自适应二值化输出图像“thresh”细化图像
  • 概要通过python带大家通过罩层对彩图进行二值化操作,最终实现抠图与图像拼接的功能。关键字:罩层 MASK 二值化 抠图最终抠图效果:通过罩层对彩图进行二值化操作,实现抠图与图像拼接图像二值化import cv2# 载入原...
  • cv2.threshold()函数的作用是将一幅灰度图二值化,基本用法如下:#ret:暂时就认为是设定的thresh阈值,mask:二值化的图像ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)plt.imshow(mask,cmap='gray...
  • I am trying to get a region of an image (ROI) using opencv python. THe version of opencv used is 2.4.3. However when I try to call the APIcv2.SetImageROIit returns me the errorAttributeError: 'module'...
  • 以下文章来源于数据杂论,作者:Wpc7113 Python 数据分析入门案例讲解https://www.bilibili.com/video/BV18f4y1i7q9/1.标准:去均值,方差规模Standardization标准:将特征数据的分布调整成标准正态分布,也叫...
  • 1、简介图像的细化主要是针对二值图而言。所谓骨架,可以理解为图像的中轴,一个长方形的骨架,是它的长方向上的中轴线。圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。2、骨架的获取骨架的获取...
  • 基本的处理思路还是和之前的一致,只是要在二值化以及凸包点集集合的大小上做一些处理,取二值化的阈值为235,凸包点集中的点个数大于5,完整的Python代码如下:import cv2 # 读取图片并转至灰度模式 imagepath =...
  • Python+OpenCV感兴趣区域ROI提取方法方法一:使用轮廓步骤1"""src为原图"""ROI = np.zeros(src.shape, np.uint8) #感兴趣区域ROIproimage = src.copy() #复制原图"""提取轮廓"""proimage=cv2.cvtColor(proimage,cv2....
  • # 图像二值化 0白色 1黑色 # 全局阈值 def threshold_image(image): gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) cv.imshow("original", gray) ------------------------------------ ret, binary = cv....
  • 原标题:R与Python手牵手:特征工程(数值型变换)作者:黄天元,复旦大学博士在读,目前研究涉及文本挖掘、社交网络分析和机器学习等。希望与大家分享学习经验,推广并加深R语言在业界的应用。邮箱:huang.tian-yuan@...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,411
精华内容 1,364
关键字:

python二值化

python 订阅