图像二值化python,python画二元函数
什么是图像二值化在了解二值化之前,先简单介绍几个概念:
彩色图像
彩色图像有三个通道:蓝色、绿色和红色,取值范围从0到255。
灰度:只有一个通道,取值范围为0-255,所以有256种彩色二值图像。
二值图像只有两种颜色,黑色和白色。图像二值化图像的二值化也很简单。它可以分两步完成,如下所示
第一步:获取阈值
获得门槛很简单。OpenCv的阈值函数可以用来获取全局阈值。也可以通过OpenCv的adaptiveThreshold获取本地阈值,也可以自定义阈值。下面简单介绍一下这三个门槛。
全局阈值
全局阈值可以通过OpenCv的阈值函数实现,如下:
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超过阈值的类型值为最大值,其他值为0THRESH_BINARY_INV超过阈值,其他值为最大值,THRESH_TRUNC超过阈值的值等于阈值,其他值不变,THRESH_TOZERO超过阈值的值不变,其他值为0THRESH_TOZERO_INV超过阈值,其他值不变,其他值不变。以下代码简单地解释了这些阈值的含义。
全局阈值THRESH _ BINARY threshold def threshold _ by _ Otsu(input _ img _ file)的实现:image=cv2 . im read(input _ img _ file)gray=cv2 . CVT color(image,2 .cv2。COLOR_BGR2GRAY) ## #要对一幅图像进行二值化,首先要将其转换成灰度图像ret,binary=CV2.threshold (gray,0,255,2。thresh _ binary cv2。thresh _ Otsu)print( threshold value % s % ret)# print threshold,超过阈值时显示白色,低于阈值时显示黑色。cv2。imshow (threshold ,binary) #显示二进制图像cv2。等待键(0) cv2.
全局阈值THRESH_TRIANGLE,三角形算法def threshold _ by _ THRESH _ TRIANGLE(input _ img _ file):Image=cv2 . im read(input _ img _ file)cv2 . im show( Image ,Image) #显示二值图像gray=cv2.cvtcolor (image,cv2.color _ bgr2gray) # #要将图像二值化,必须先将图像转换成灰度图像ret,binary=cv2.threshold (gray,0,255,2。thresh _ binary cv2。thresh _ triangle)print( threshold value % s % ret)# print threshold,高于该阈值将显示为白色,低于该阈值将显示为黑色;cv2。imshow (threshold ,binary) #显示二进制图像cv2。等待键(0) cv2.
实现全局阈值THRESH _ BINARY _ INV threshold def threshold _ by _ THRESH _ BINARY _ INV(input _ img _ file):Image=cv2 . im read(input _ img _ file)cv2 . im show( Image ,Image) #显示二值图像gray=cv2.cvtcolor (image,cv2.color _ bgr2gray) # #要对图像进行二值化,首先要将图像转换成灰度图像ret,binary=cv2.threshold (gray,0,255,2 .thresh _ binary cv2。thresh _ binary _ inv)print( threshold value % s % ret)#打印阈值,高于该阈值以白色显示,低于该阈值以黑色显示;cv2。imshow (thresholdbinary) #显示二进制图像cv2。等待键(0)
同样,这里也不用说其他类型,只需要修改阈值函数的类型参数type即可。看完这三个效果,我们可以得出一个结论:
简历。OTSU和cv。THRESH_TRAINGLE都是自动采集阈值。
THRESH_OTSU:适用于双峰
THRESH_TRIANGLE:适用于单峰,最初用于医学细胞分割等。
好了,知道了系统提供的全局阈值,下面我简单介绍一下自定义全局阈值。自定义全局阈值很简单,就是自己定义阈值函数的参数。
自定义全局阈值
(1) threshold _ binary _ inv为0 ret,binary=cv。阈值(灰色,127,255,Cv。THRESH_BINARY)代码如下:def threshold _ by _ avto(input _ img _ file):Image=cv2 . im read(input _ img _ file)cv2 . im show( Image ,Image) #显示二值图像gray=cv2.cvtcolor (image,cv2.color _ bgr2gray) # #要将图像二值化,必须先将图像转换成灰度图像ret,binary=cv2.threshold (gray,127,255,2。threshold _ binary) #自定义阈值print(threshold value %s% ret) #打印阈值,高于该阈值以白色显示,低于该阈值以黑色显示CV2。IM show (threshold ,binary) #显示二进制图像CV2。Waitkey (0) CV2。破坏性地Windows()看一看。
(2)大于127的THRESH_TRUNC截断值全部为127,其他值不变。
def threshold _ by _ avto(input _ img _ file):image=cv2 . im read(input _ img _ file)cv2 . im show( image ,image) #显示二值图像gray=cv2.cvtColor(image,2 .cv2。COLOR_BGR2GRAY) ## #要将一幅图像二值化,首先要将其转换成灰度图像ret,binary=CV2.threshold (Gray,127,255,CV2.threshold _ trunc) #自定义阈值打印( threshold value %s% ret) #打印阈值,如果超过阈值,则显示为白色;如果低于阈值,则以黑色显示;cv2.im show (threshold ,binary) #显示二进制图像cv2 . wait key(0)cv2 . destructily windows();看一下效果图:
(3)超过阈值的3)THRESH_TOZERO的值不变,小于阈值的值为0。
def threshold _ by _ avto(input _ img _ file):image=cv2 . im read(input _ img _ file)cv2 . im show( image ,image) #显示二值图像gray=cv2.cvtColor(image,2 .cv2。COLOR_BGR2GRAY) ## #要对一幅图像进行二值化,首先要将其转换成灰度图像ret,binary=CV2.threshold (Gray,127,255,2。threshold _ to zero) #自定义阈值print(threshold value %s% ret) #打印阈值,高于该阈值以白色显示,低于该阈值以黑色显示CV2。IM show (threshold ,binary) #显示二进制图像CV2。Waitkey (0) CV2。破坏性Windows()正常。
全局阈值和自定义全局阈值。现在我们来解释一下局部阈值。
局部阈值
局部阈值可以使画面更清晰,利用OpenCV的adaptiveThreshold函数可以实现局部阈值。功能和参数描述如下:
adaptiveThreshold(src,maxValue,adaptiveMethod,thresholdType,blockSize,C[,dst]) - dst)
参数描述:
Src:输入图像(8位单通道图像)。
MaxValue:使用THRESH_BINARY和THRESH_BINARY_INV的最大值。
adaptiveMethod参数指示自适应阈值算法,它是average (ADAPTIVE_THRESH_MEAN_C)或xfdfh(ADAPTIVE _ THRESH _ Gaussian _ C)。
ThresholdType:阈值类型,必须是threshold _ binary或threshold _ binary _ inv的阈值类型。
Block: blockSize(大于1的奇数,如3、5、7……)。
c:常数,代表从平均值或加权平均值中减去的数。通常,这是一个正值,但也可以是零或负值。
在平均算法和xfdfh算法的情况下,可以通过计算每个像素周围的块大小x块大小块的加权平均值并减去常数C来获得自适应阈值.如果用平均法,所有像素周围的权重都是一样的;如果使用xfdfh的方法,则每个像素周围的像素的权重根据其到中心点的距离通过xfdfh等式获得:
jubuthreshold(input _ img _ file):image=cv2 . im read(input _ img _ file)cv2 . im show( image ,image) #显示二值图像gray=cv2.cvtColor(image,2 .color _ bgr 2 gray)binary=cv2 . adaptive threshold(gray,255,cv2.adaptive _ thresh _ mean _ c,cv2.thresh _ binary,25,10) cv2.imshow (binary ,binary) cv2.waitkey。
当然,我们也可以自己计算门槛。自己计算阈值就是计算图像的平均值,用平均值作为阈值分割图像。代码如下:
custom _ threshold(input _ img _ file):image=cv2 . im read(input _ img _ file)cv2 . im show( image ,image) #显示二值图像gray=cv2.cvtColor(image,2 .CVColor _ BGR2Gray) h,w=灰色。Shape [:2] m=NP。Reshape (Gray,[1,h*w]) #将图像变成一行h*w列mean=m.sum()/(h*w) #计算图像的平均值,并使用平均值。Binary=cv2.threshold (gray,mean,255,cv2 . thresh _ binary)print( threshold value % s % ret cv2 . im show( cud Tom _ binary ,binary)cv2 . wait key(0)cv2 . destructily windows(
而自己计算阈值得到的阈值如下:
好了,到目前为止,我们基本上已经讨论了常用的阈值和定义的阈值。先说如何根据阈值对图像进行二值化。
第二步:根据阈值去二值化图像
以上都是关于如何获取阈值的问题。有许多方法可以获得阈值。具体根据实际发展情况使用。得到阈值后,二值化开启。这里很简单。其实上面已经列出来了,只是为了方便大家看效果。
cv2.threshold和cv2.adaptiveThreshold这两个函数已经被二进制化,并将阈值返回给我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。