前言
这是图像增强部分的最后一点内容,因为在《指数增强》中说过,除了指数增强有FPGA,所以其他几个方法只讲Python,懂原理即可。
一、图像灰度转换
图像灰度处理很简单,把图像的红色、绿色、蓝色通道像素乘上相应的系数再加和。公式如下。
g r a y = r e d × 0.299 + g r e e n × 0.587 + b l u e × 0.114 gray = red \times 0.299 + green \times 0.587 + blue \times 0.114 gray=red×0.299+green×0.587+blue×0.114
import numpy as np
import matplotlib.pyplot as plt
img = plt.imread("lenna.png")
gray = 0.299 * img[:, :, 0] + 0.587 * img[:, :, 1] + 0.114 * img[:, :, 2]
gray *= 255
gray = gray.astype(np.uint8)
#以下用严谨的方式画图
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(1,2,1)
ax.set_title("raw image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(img)
ax = fig.add_subplot(1,2,2)
ax.set_title("gray image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
二、直方图像素统计
公式(1)表示每个像素值的占比。公式(2)是像素累加,比如像素值i=14是14之前所有像素包括14,13,12,11…个数的总和占比。公式(3)是公式(2)的基础上对概率值进行放大,由原来的[0-1]变成[0-255]。
{ P ( k ) = n ( k ) N s ( k ) = ∑ i = 0 k n ( i ) N s ( k ) ′ = s ( k ) × 255 = ∑ i = 0 k n ( i ) N × 255 \left\{ \begin{align} & P(k) = \frac{n(k)}{N}\\ & s(k) = \sum_{i=0}^k\frac{n(i)}{N} \\ &s(k)'=s(k)\times 255 = \sum_{i=0}^k\frac{n(i)}{N}\times 255 \end{align} \right. ⎩ ⎨ ⎧P(k)=Nn(k)s(k)=i=0∑kNn(i)s(k)′=s(k)×255=i=0∑kNn(i)×255
h, w = gray.shape#获取灰度图的高和宽
numpixel = np.zeros((256, 1))
for i in range(h):
for j in range(w):
numpixel[gray[i, j]] += 1#统计像素
plt.title("hist stat")
plt.xlabel("pixel")
plt.ylabel("number")
plt.bar(range(numpixel.shape[0]), numpixel[:, 0])
plt.show()
根据公式(3)编写以下代码
sk = np.zeros((256, 1))
for i in range(numpixel.shape[0]):
if i == 0:
sk[i][0] = numpixel[i][0]#第1个不用累加
else:
sk[i][0] = sk[i - 1][0] + numpixel[i][0]#像素累加
sk = (sk / np.sum(numpixel)) * 255#根据公式(3)
sk = sk.astype(np.uint8)
plt.title("cum stat")
plt.xlabel("pixel")
plt.ylabel("number")
plt.bar(range(sk.shape[0]), sk[:, 0])
plt.show()
三、直方图均衡
hist_img = np.zeros((h, w))
for i in range(h):
for j in range(w):
hist_img[i, j] = sk[gray[i, j]]#根据公式(3)
fig = plt.figure(figsize=(8,8))
ax = fig.add_subplot(1,2,1)
ax.set_title("gray image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = fig.add_subplot(1, 2, 2)
ax.set_title("hist image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(hist_img, cmap="gray")
总结
图像增强到此结束,完结撒花。下一部分内容,图像降噪算法介绍,敬请期待。