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.youkuaiyun.com/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)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值