Python-opencv 灰度直方图+图像二值化

1. 灰度直方图

1.1.灰度直方图概念

众所周知,彩色图像一般有RGB三个通道,而灰度化后每个像素只有一个通道,并且取值范围为[0,255],以白色到黑色的明暗变化显现图像。

而灰度直方图就是将每个像素点的灰度值进行统计,绘制0-255灰度值在整个图片中所占的比例。

1.2. 灰度化

import cv2
import matplotlib.pyplot as plt

image = cv2.imread('plane.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.subplot(211)
plt.imshow(image)
plt.subplot(212)
plt.imshow(gray, cmap="gray")

结果图:

Python-opencv 灰度直方图+图像二值化_第1张图片

(图一由于cv2是以BGR方式读取,plt输出以RGB输出,所以颜色失真,但是不影响灰度化)

1.2. 灰度直方图绘制

def hist(img):
    img_ravel = img.ravel()
    hist = [0 for i in range(256)]
    for p in img_ravel:
        hist[int(p)] += 1
    for i in range(256):
        hist[i] /= img_ravel.shape[0]
    plt.plot(hist)


hist(gray)

效果图:

Python-opencv 灰度直方图+图像二值化_第2张图片

 2. 基于灰度直方图的图像二值化

图像二值化就是在灰度化的基础上,选取某个阈值,将大于阈值的像素点设定为255,其余为0

def binary(img, t):
    plt.subplot(211)
    plt.imshow(img, cmap="gray")
    index = 0
    flag = False
    hist_sum = 0
    img_ravel = img.ravel()
    hist = [0 for i in range(256)]
    for p in img_ravel:
        hist[int(p)] += 1
    for i in range(256):
        hist[i] /= img_ravel.shape[0]
        hist_sum += hist[i]
        if not flag:
            if hist_sum >= t:
                index = i
                flag = True
    for x in range(img.shape[0]):
        for y in range(img.shape[1]):
            if (img[x][y] <= index):
                img[x][y] = 0
            else:
                img[x][y] = 255
    plt.subplot(212)
    plt.imshow(img, cmap="gray")
    plt.show()

结果:

Python-opencv 灰度直方图+图像二值化_第3张图片

 

你可能感兴趣的:(图像处理与模式识别,opencv,python,计算机视觉)