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")
结果图:
(图一由于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)
效果图:
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()
结果: