小白学python(opencv图像二值化)

  • 知识回顾
  • 图像二值化
  • 图像二值化的实现
  • 全局阈值
  • 局部阈值

知识回顾

在图像二值化之前,让我们先了解下图像的基本知识。
这也算是对我前面的一个小小的回顾叭,里面有摘抄大佬的精彩解释也有我自己的一点拙见。

一个像素点的颜色是由RGB三个值来表现的,所以一个像素点
矩阵对应三个颜色向量矩阵,分别是R矩阵,G矩阵,B矩阵,
它们也都是同样大小的矩阵。
在图像处理中,用RGB三个分量(R:Red,G:Green,B:Blue)
即红、绿、蓝三原色来表示真彩色,R分量,G分量,B分量的取值
范围均为0~255,比如电脑屏幕上的一个红色的像素点的三个分量
的值分别为:255,0,0。
在理解了一张图片是由一个像素点矩阵构成之后,我们就知道
我们对图像的处理就是对这个像素点矩阵的操作,想要改变某个
像素点的颜色,我们只要在这个像素点矩阵中找到这个像素点的
位置,比如第x行,第y列,所以这个像素点在这个像素点矩阵中的
位置就可以表示成(x,y),因为一个像素点的颜色由红、绿、蓝
三个颜色变量表示,所以我们通过给这三个变量赋值,来改变这个
像素点的颜色,比如改成红色(255,0,0),可以表示为
(x,y,(R=255,G=0,B=0))。
图像灰度化就是让像素点矩阵中的每一个像素点都满足下面的关系:
R=G=B
二值化就是让图像的像素点矩阵中的每个像素点的灰度值为0(黑色)
或者255(白色),也就是让整个图像呈现只有黑和白的效果。
在灰度化的图像中灰度值的范围为0~255,在二值化后的图像中的
灰度值范围是0或者255。

图像二值化

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

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

(百度大法好)

图像二值化的实现

全局阈值

threshold()

第一个参数       src        指原图像,原图像应该是灰度图。
第二个参数         x        指用来对像素值进行分类的阈值。
第三个参数         y        指当像素值高于(有时是小于)
                           阈值时应该被赋予的新的像素值
 第四个参数     Methods     指不同的不同的阈值方法
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("%s"%ret)
    cv.imshow("binary",binary)

这里用的是cv.THRESH_BINARY|cv.THRESH_OTSU全局阈值方法,

结果:

python统计二值图的像素 图像二值化python_像素点


python统计二值图的像素 图像二值化python_python统计二值图的像素_02


我们再换一种方法(cv.THRESH_BINARY|cv.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("%s"%ret)
    cv.imshow("binary",binary)

python统计二值图的像素 图像二值化python_像素点_03


python统计二值图的像素 图像二值化python_python统计二值图的像素_04


我们也可以自定义阈值来截取,即将第二个参数自定义为阈值,第四个参数中只用cv.THRESH_BINARY(一种处理方法),不用加任何自动取阈值方法。

def threshold_demo(image):#图像二值化
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    ret,binary=  cv.threshold(gray,144,255,cv.THRESH_BINARY)
    print("%s"%ret)
    cv.imshow("binary",binary)

局部阈值

当同一幅图像上的不同部分的具有不同亮度时。这种情况下
     我们需要采用局部阈值。此时的阈值是根据图像上的每一个小
     区域计算与其对应的阈值。因此在同一幅图像上的不同区域
     采用的是不同的阈值,从而使我们能在亮度不同的情况下得到
     更好的结果。
cv2.adaptiveThreshold()
第一个参数          src       指原图像,原图像应该是灰度图。
第二个参数           x        指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值
第三个参数    adaptive_method  为 CV_ADAPTIVE_THRESH_MEAN_C 
                             或 CV_ADAPTIVE_THRESH_GAUSSIAN_C
第四个参数    threshold_type  指取阈值类型:必须是下者之一                                                                                                                                                                                                                                                                •  CV_THRESH_BINARY,                                                                                         • CV_THRESH_BINARY_INV
第五个参数    block_size      用来计算阈值的象素邻域大小: 3, 5, 7, ...
第六个参数       param1     与方法有关的参数。对方法 CV_ADAPTIVE_THRESH_MEAN_C     
                              和 CV_ADAPTIVE_THRESH_GAUSSIAN_C,

代码:

def local_threshold(image):  #图像二值化2局部阈值
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    binary =  cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,cv.THRESH_BINARY,25,10)

    cv.imshow("binary", binary)

运行效果:

python统计二值图的像素 图像二值化python_二值化_05