用python写一段代码实现直方图均衡的函数,采用[h,w]=src.shape,并返回dst
时间: 2023-04-12 17:00:48 浏览: 224
好的,以下是用 Python 实现直方图均衡的函数的代码:
```python
import numpy as np
def histogram_equalization(src):
# 获取图像的高度和宽度
h, w = src.shape
# 计算每个像素值出现的次数
hist, _ = np.histogram(src.flatten(), bins=256, range=(0, 255))
# 计算每个像素值出现的概率
prob = hist / (h * w)
# 计算累计分布函数
cdf = np.cumsum(prob)
# 计算均衡化后的像素值
dst = np.floor(255 * cdf[src]).astype(np.uint8)
return dst
```
这个函数接受一个灰度图像作为输入,返回一个经过直方图均衡化处理后的图像。函数中使用了 NumPy 库中的一些函数来计算直方图、概率、累计分布函数等。
相关问题
你可以不使用库的前提下用Python写一个直方图匹配的代码吗
可以,直方图匹配是一种基本的图像处理技术,可以通过计算两幅图像的直方图来实现。以下是一个简单的 Python 代码示例:
```
import numpy as np
import cv2
# 读取原始图像和目标图像
src = cv2.imread('source.jpg', )
dst = cv2.imread('target.jpg', )
# 计算原始图像和目标图像的直方图
src_hist = cv2.calcHist([src], [], None, [256], [, 256])
dst_hist = cv2.calcHist([dst], [], None, [256], [, 256])
# 将直方图归一化
src_hist = cv2.normalize(src_hist, src_hist, , 255, cv2.NORM_MINMAX)
dst_hist = cv2.normalize(dst_hist, dst_hist, , 255, cv2.NORM_MINMAX)
# 计算直方图的累积分布函数
src_cdf = np.cumsum(src_hist)
dst_cdf = np.cumsum(dst_hist)
# 计算原始图像和目标图像的直方图均衡化函数
src_eq = np.uint8(255 * src_cdf / src_cdf[-1])
dst_eq = np.uint8(255 * dst_cdf / dst_cdf[-1])
# 对原始图像进行直方图匹配
matched = np.interp(src.flatten(), src_eq, dst_eq)
matched = matched.reshape(src.shape)
# 显示结果
cv2.imshow('Source', src)
cv2.imshow('Target', dst)
cv2.imshow('Matched', matched)
cv2.waitKey()
cv2.destroyAllWindows()
```
这段代码可以读取两幅灰度图像,计算它们的直方图,然后对原始图像进行直方图匹配,得到匹配后的图像。
使用直方图均衡化来做opencv-python图像对齐
图像对齐是指将多幅图像对齐到同一个坐标系下,以方便进行后续处理,例如图像融合、图像拼接等。在进行图像对齐时,常常需要考虑到图像的亮度、对比度等因素,因此可以使用直方图均衡化来增强图像的对比度。
下面是使用opencv-python实现图像对齐的示例代码,其中包括了直方图均衡化的步骤:
```python
import cv2
import numpy as np
# 读取两张待对齐的图片
img1 = cv2.imread('img1.jpg')
img2 = cv2.imread('img2.jpg')
# 将图片转为灰度图
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
# 对灰度图进行直方图均衡化
equ1 = cv2.equalizeHist(gray1)
equ2 = cv2.equalizeHist(gray2)
# 初始化ORB检测器
orb = cv2.ORB_create()
# 使用ORB检测关键点和描述子
kp1, des1 = orb.detectAndCompute(equ1, None)
kp2, des2 = orb.detectAndCompute(equ2, None)
# 初始化暴力匹配器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
# 匹配两幅图片的描述子
matches = bf.match(des1, des2)
# 根据匹配结果筛选出较好的匹配点
matches = sorted(matches, key=lambda x: x.distance)
good_matches = matches[:50]
# 获取匹配点的坐标
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)
# 计算透视变换矩阵
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# 对第一张图片进行透视变换,以将其对齐到第二张图片上
aligned_img = cv2.warpPerspective(img1, M, (img2.shape[1], img2.shape[0]))
# 显示对齐后的图片
cv2.imshow('Aligned Image', aligned_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先使用`cv2.cvtColor`函数将两张图片转为灰度图,然后分别对灰度图进行直方图均衡化,以增强图像的对比度。接着使用ORB特征检测器和暴力匹配器来匹配两幅图片的关键点,并筛选出较好的匹配点。最后使用`cv2.findHomography`函数计算透视变换矩阵,并对第一张图片进行透视变换,以将其对齐到第二张图片上。
阅读全文