直方图规定化计算过程

书接上回,上一篇讲了直方图均衡化的原理,我们继续讲一下直方图规定化的原理,在看这一篇之前请先看那一篇文章。

直方图均衡化计算过程:

https://blog.csdn.net/macunshi/article/details/79815870

要想对图像进行直方图规定化处理,我们需要有逆向的思维,因为在计算的过程中总是操作像素进行灰度映射转换,问题就在于这个灰度映射关系怎么得到。我们用R代表原图,S代表均衡处理后的图,Z代表规定化处理后的图,那么我们作如下考虑:

R——>S~V<——>Z

对Z进行均衡化得到V,把V和S看成具有近似的属性,那么对应关系不就找到了吗?那么有同学就问了,R像素灰度我们已知,Z我们不知道啊,这怎么计算?我们对理论上所有的灰度进行均衡化计算不就完了吗。

上一篇文章我们完成了R—>S的变换,之后的步骤如下图所示:

 

其实就是对期望的直方图分布的像素灰度值进行均衡化处理,找到反向映射关系。注意反向对应时应该找最小的期望灰度值。

 

然后在使用反向映射关系对原图的均衡化图像进行处理,这样就可以得到规定化直方图分布的图像。当然在计算过程中你会发现有可能原图均衡化后的图像中像素值不能在反向映射关系中找到,即V中不存在S的值,此时可以保持等值映射,也可以寻找最近的V值进行映射。

  • 33
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
在Python中,可以使用OpenCV和NumPy库来实现直方图规定化。首先,需要计算原图像和目标图像的灰度直方图。然后,根据两个直方图的差异建立灰度级的映射关系。最后,将原图像中的每个像素值映射到目标图像中的对应像素值,以实现直方图规定化。 以下是一个简单的示例代码,实现了直方图规定化过程: ```python import cv2 import numpy as np import matplotlib.pyplot as plt # 计算原图像和目标图像的灰度直方图 def calculate_histogram(image): gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) histogram = cv2.calcHist([gray_image], [0], None, [256], [0, 256]) histogram /= histogram.sum() # 归一化直方图 return histogram # 直方图规定化 def histogram_matching(source_image, target_image): source_hist = calculate_histogram(source_image) target_hist = calculate_histogram(target_image) # 计算累积直方图 source_cumulative_hist = source_hist.cumsum() target_cumulative_hist = target_hist.cumsum() # 计算灰度级的映射关系 mapping = np.zeros(256, dtype=np.uint8) for i in range(256): mapping[i = np.argmin(np.abs(source_cumulative_hist - target_cumulative_hist[i])) # 将原图像中的像素值映射到目标图像中的对应像素值 matched_image = cv2.LUT(source_image, mapping) return matched_image # 读取原图像和目标图像 source_image = cv2.imread("source_image.jpg") target_image = cv2.imread("target_image.jpg") # 进行直方图规定化 matched_image = histogram_matching(source_image, target_image) # 显示结果 plt.subplot(131) plt.imshow(cv2.cvtColor(source_image, cv2.COLOR_BGR2RGB)) plt.title("Source Image") plt.subplot(132) plt.imshow(cv2.cvtColor(target_image, cv2.COLOR_BGR2RGB)) plt.title("Target Image") plt.subplot(133) plt.imshow(cv2.cvtColor(matched_image, cv2.COLOR_BGR2RGB)) plt.title("Matched Image") plt.show() ``` 这段代码首先定义了一个函数`calculate_histogram`来计算灰度直方图,并将直方图归一化。然后,定义了主函数`histogram_matching`来实现直方图规定化过程。最后,通过调用这两个函数来进行直方图规定化,并将结果显示出来。 需要注意的是,此示例仅展示了直方图规定化的基本原理和实现方法,实际应用时可能需要根据具体需求进行适当修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值