OpenCV:直方图均衡

直方图均衡

这学期上了机器视觉这门课,老师布置的作业打算自己实现一遍,老是调包没啥意思。


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)

猜你喜欢

转载自blog.csdn.net/weixin_42231070/article/details/82941194
今日推荐