Python与FPGA——直方图均衡


前言

  这是图像增强部分的最后一点内容,因为在《指数增强》中说过,除了指数增强有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=0kNn(i)s(k)=s(k)×255=i=0kNn(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")

在这里插入图片描述


总结

  图像增强到此结束,完结撒花。下一部分内容,图像降噪算法介绍,敬请期待。

  • 22
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值