python图像处理函数,Python 处理图像

  python图像处理函数,Python 处理图像

  本文将详细介绍图像阈值化,包括阈值化、固定阈值化和自适应阈值化,它是图像边缘检测或图像增强的基础。有兴趣的可以看看。

  00-1010 1.图像阈值2。固定阈值1。二进制阈值2。反二进制阈值3。截断阈值4。阈值05。反阈值0 3。自适应阈值处理4。摘要

  

目录

  图像阈值化的目的是去除图像中低于或高于某一值的部分像素,从而提取图像中的物体,区分图像的背景和噪声。

  在灰化的图像中,每个像素只有一个灰度值,其大小表示明暗程度。阈值处理可以将图像中的像素分为两种颜色。常用阈值算法如公式(1)所示:

  当一个像素的灰度级Gray(i,j)小于阈值T时,其像素设为0,表示黑色;当灰度级Gray(i,j)大于等于阈值T时,其像素值为255,表示白色。

  在Python的OpenCV库中,提供了固定阈值函数()和自适应阈值函数()来对图像进行阈值处理[3-4]。

  

一.图像阈值化

  OpenCV提供了函数threshold()来实现固定阈值,其原型如下:

  dst=cv2.threshold(src,thresh,maxval,type[,dst])

  src表示输入图像的数组,以及8位或32位浮点类型的多通道数量。

  DST代表阈值化后的输出图像,其类型和通道数与src一致。

  thresh表示阈值。

  MaxVal表示最大值。当选择CV_THRESH_BINARY或CV_THRESH_BINARY_INV作为参数阈值类型时,此参数是阈值类型的最大值。

  type表示阈值类型。

  其中,threshold()函数不同类型的处理算法如表1所示。

  相应的阈值描述如图1所示:

  阈值处理广泛应用于各行各业,如生物学中的细胞图分割,交通领域中的车牌识别等。通过阈值处理,将图像转换成黑白图像,为后续的图像识别和图像分割提供了更好的支持。下面详细解释五种阈值算法。

  

二.固定阈值化处理

  这个函数的原型是threshold (gray,127,255,cv2.threshold _ binary)。该方法首先选择一个特定的阈值,比如127,然后按照以下规则进行阈值处理。

  当当前像素的灰度值大于阈值(如127)时,将其像素的灰度值设置为最大值(如8位的最大灰度值为255);否则,像素的灰度值被设置为0。如果阈值为127,像素灰度值为163,则阈值设置为255;如果像素的灰度值是82,则阈值被设置为0。

  二进制阈值的Python代码如下:

  # -*-编码: utf-8 -*-

  # By:伊斯特蒙特

  导入cv2

  将numpy作为np导入

  #阅读图片

  src=cv2.imread(luo.png )

  #灰度图像处理

  grayImage=cv2.cvtColor(src,cv2。COLOR_BGR2GRAY)

  #二进制阈值处理

  r,b=cv2.threshold(灰度图像,127,255,cv2。THRESH_BINARY)

  #显示图像

  cv2.imshow(src ,src)

  cv2.imshow(result ,b)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  输出结果如图2所示,左边是小图像的原始图像,右边是二进制阈值处理的效果图像。像素值大于12

  7的设置为255,小于等于127设置为0。

  

  

  

2.反二进制阈值化

  该函数的原型为 threshold(Gray,127,255,cv2.THRESH_BINARY_INV)。其方法首先要选定一个特定的阈值量,比如127,再按照如下所示的规则进行阈值化处理。

  

  当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值设定为0;否则,像素点的灰度值设置为最大值。如阈值为127时,像素点的灰度值为211,则阈值化设置为0;像素点的灰度值为101,则阈值化设置为255。

  反二进制阈值化处理的Python代码如下所示:

  

# -*- coding: utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  #读取图片

  src = cv2.imread(luo.png)

  #灰度图像处理

  grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

  #反二进制阈值化处理

  r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY_INV)

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("result", b)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  

  输出结果如图3所示:

  

  

  

3.截断阈值化

  该函数的原型为 threshold(Gray,127,255,cv2.THRESH_TRUNC)。图像中大于该阈值的像素点被设定为该阈值,小于或等于该阈值的保持不变,比如127。新的阈值产生规则如下:

  

  比如阈值为127时,像素点的灰度值为167,则阈值化设置为127;像素点的灰度值为82,则阈值化设置为82。截断阈值化处理的Python代码如下所示:

  

# -*- coding: utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  #读取图片

  src = cv2.imread(luo.png)

  #灰度图像处理

  grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

  #截断阈值化处理

  r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_TRUNC)

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("result", b)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  

  输出结果如图4所示,图像经过截断阈值化处理将灰度值处理于0至127之间。

  

  

  

4.阈值化为0

  该函数的原型为 threshold(Gray,127,255,cv2.THRESH_TOZERO)。按照如下公式对图像的灰度值进行处理。

  

  当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值保持不变;否则,像素点的灰度值设置为0。如阈值为127时,像素点的灰度值为211,则阈值化设置为211;像素点的灰度值为101,则阈值化设置为0。

  图像阈值化为0处理的Python代码如下所示:

  

# -*- coding: utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  #读取图片

  src = cv2.imread(luo.png)

  #灰度图像处理

  grayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

  #阈值化为0处理

  r, b = cv2.threshold(grayImage, 127, 255, cv2.THRESH_TOZERO)

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("result", b)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  

  输出结果如图5所示,该算法把比较亮的部分不变,比较暗的部分处理为0。

  

  

  

5.反阈值化为0

  该函数的原型为 threshold(Gray,127,255, cv2.THRESH_TOZERO_INV)。按照如下公式对图像的灰度值进行处理。

  

  当前像素点的灰度值大于thresh阈值时(如127),其像素点的灰度值设置为0;否则,像素点的灰度值保持不变。如阈值为127时,像素点的灰度值为211,则阈值化设置为0;像素点的灰度值为101,则阈值化设置为101。

  图像反阈值化为0处理的Python代码如下所示:

  

# -*- coding: utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  #读取图片

  src = cv2.imread(luo.png)

  #灰度图像处理

  GrayImage = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

  #二进制阈值化处理

  r, b = cv2.threshold(GrayImage, 127, 255, cv2.THRESH_TOZERO_INV)

  #显示图像

  cv2.imshow("src", src)

  cv2.imshow("result", b)

  #等待显示

  cv2.waitKey(0)

  cv2.destroyAllWindows()

  

  输出结果如图6所示:

  

  同样,我们在对民族图腾及图像进行识别和保护时,也需要进行图像阈值化处理。下面代码是对比苗族服饰图像五种固定阈值化处理的对比结果。

  

# -*- coding: utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  import matplotlib.pyplot as plt

  #读取图像

  img=cv2.imread(miao.png)

  grayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

  #阈值化处理

  ret,thresh1=cv2.threshold(grayImage,127,255,cv2.THRESH_BINARY)

  ret,thresh2=cv2.threshold(grayImage,127,255,cv2.THRESH_BINARY_INV)

  ret,thresh3=cv2.threshold(grayImage,127,255,cv2.THRESH_TRUNC)

  ret,thresh4=cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO)

  ret,thresh5=cv2.threshold(grayImage,127,255,cv2.THRESH_TOZERO_INV)

  #显示结果

  titles = [Gray Image,BINARY,BINARY_INV,TRUNC,

  TOZERO,TOZERO_INV]

  images = [grayImage, 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()

  

  输出结果如图7所示:

  

  

  

三.自适应阈值化处理

  前面讲解的是固定值阈值化处理方法,而当同一幅图像上的不同部分具有不同亮度时,上述方法就不在适用。此时需要采用自适应阈值化处理方法,根据图像上的每一个小区域,计算与其对应的阈值,从而使得同一幅图像上的不同区域采用不同的阈值,在亮度不同的情况下得到更好的结果。

  自适应阈值化处理在OpenCV中调用cv2.adaptiveThreshold()函数实现,其原型如下所示:

  dst = adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])

  – src表示输入图像

  – dst表示输出的阈值化处理后的图像,其类型和尺寸需与src一致

  – maxValue表示给像素赋的满足条件的最大值

  – adaptiveMethod表示要适用的自适应阈值算法,常见取值包括ADAPTIVE_THRESH_MEAN_C(阈值取邻域的平均值) 或 ADAPTIVE_THRESH_GAUSSIAN_C(阈值取自邻域的加权和平均值,权重分布为一个高斯函数分布)

  – thresholdType表示阈值类型,取值必须为THRESH_BINARY或THRESH_BINARY_INV

  – blockSize表示计算阈值的像素邻域大小,取值为3、5、7等

  – C表示一个常数,阈值等于平均值或者加权平均值减去这个常数

  当阈值类型thresholdType为THRESH_BINARY时,其灰度图像转换为阈值化图像的计算公式如下所示:

  

  当阈值类型thresholdType为THRESH_BINARY_INV时,其灰度图像转换为阈值化图像的计算公式如下所示:

  

  其中,dst(x,y)表示阈值化处理后的灰度值,T(x,y)表示计算每个单独像素的阈值,其取值如下:

  当adaptiveMethod参数采用ADAPTIVE_THRESH_MEAN_C时,阈值T(x,y)为blockSize×blockSize邻域内(x,y)减去参数C的平均值。

  当adaptiveMethod参数采用ADAPTIVE_THRESH_GAUSSIAN_C时,阈值T(x,y)为blockSize×blockSize邻域内(x,y)减去参数C与高斯窗交叉相关的加权总和。
下面的代码是对比固定值阈值化与自适应阈值化处理的方法。

  

# -*- coding: utf-8 -*-

  # By:Eastmount

  import cv2

  import numpy as np

  import matplotlib.pyplot as plt

  import matplotlib

  #读取图像

  img = cv2.imread(miao.png)

  #图像灰度化处理

  grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

  #固定值阈值化处理

  r, thresh1 = cv2.threshold(grayImage, 127, 255, cv2.THRESH_BINARY)

  #自适应阈值化处理 方法一

  thresh2 = cv2.adaptiveThreshold(grayImage, 255,

  cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)

  #自适应阈值化处理 方法二

  thresh3 = cv2.adaptiveThreshold(grayImage, 255,

  cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)

  #设置字体

  matplotlib.rcParams[font.sans-serif]=[SimHei]

  #显示图像

  titles = [灰度图像, 全局阈值, 自适应平均阈值, 自适应高斯阈值]

  images = [grayImage, 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()

  

  输出结果如图8所示,左上角为灰度化处理图像;右上角为固定值全局阈值化处理图像(cv2.threshold);左下角为自适应邻域平均值分割,噪声较多;右下角为自适应邻域加权平均值分割,采用高斯函数分布,其效果相对较好。

  

  

  

四.总结

  本文主要讲解了图像阈值化处理知识,调用OpenCV的threshold()实现固定阈值化处理,调用adaptiveThreshold()函数实现自适应阈值化处理。本文知识点将为后续的图像处理提供良好的基础。

  以上就是Python图像运算之图像阈值化处理详解的详细内容,更多关于Python图像阈值化处理的资料请关注盛行IT软件开发工作室其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: