直方图均衡
这学期上了机器视觉这门课,老师布置的作业打算自己实现一遍,老是调包没啥意思。
1.读取图片
注意imread,因为给的图片是单通道的,如果不设定读取格式cv2.IMREAD_UNCHANGED,则会默认转换成三通道的。
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("homework1.bmp", cv2.IMREAD_UNCHANGED)
print(type(img))
print(img.shape)
cv2.imshow("IMAGE", img)
cv2.waitKey(0)
# <class 'numpy.ndarray'>
# (431, 690)
2.均衡算法
我这里合并图片直接合并数组了,当然可以自己设置一下ROI,然后copy一下。
设置ROI:https://blog.csdn.net/aa846555831/article/details/49425773
当然还是调包舒服啊
cv2.equalizeHist(img_copy, img)
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread("homework1.bmp", cv2.IMREAD_UNCHANGED)
img_copy = img.copy()
# cv2.imwrite()
hist = [0 for i in range(256)]
for i in range(img.shape[0]):
for j in range(img.shape[1]):
value = img[i][j]
hist[value] += 1
hist_sum = float(sum(hist))
hist_one = [i/hist_sum for i in hist]
for i in range(1, 256):
hist_one[i] = hist_one[i-1] + hist_one[i]
hist_map = [round(i * 255) for i in hist_one]
for i in range(img.shape[0]):
for j in range(img.shape[1]):
img[i][j] = hist_map[img[i][j]]
img_mix = np.concatenate([img_copy, img], axis=1)
# hstack 也可以实现同样的功能
cv2.imshow("Initial & Equalize", img_mix)
cv2.imwrite("PICTURE_MIX.jpg", img_mix)
# 保存图片
fig, axs = plt.subplots(1, 2)
axs[0].hist(img_copy.flat, bins=256)
axs[1].hist(img.flat, bins=256)
cv2.imshow("Initial", img_copy)
cv2.imshow("Equalize", img)
fig.show()
cv2.waitKey(0)