python-3.x - 使用python和opencv进行直方图均衡而不使用内置函数
问题描述
我使用了公式:((L-1)/MN) ni 其中 L 是灰度的总数,M N 是图像的大小,ni 是累积频率
但我总是得到全黑图像。我也尝试过其他图像。
import numpy as np
import cv2
path="C:/Users/Arun Nambiar/Downloads/fingerprint256by256 (1).pgm"
img=cv2.imread(path,0)
#To display image before equalization
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
a=np.zeros((256,),dtype=np.float16)
b=np.zeros((256,),dtype=np.float16)
height,width=img.shape
#finding histogram
for i in range(width):
for j in range(height):
g=img[j,i]
a[g]=a[g]+1
print(a)
#performing histogram equalization
tmp=255/(height*width)
a[0]=tmp*a[0]
b[0]=round(a[0])
for g in range(1,width):
a[g]=(a[g]*tmp)+(a[g-1]*tmp)
b[g]=round(a[g])
print(b)
b=b.astype(np.uint8)
print(b)
for i in range(width):
for j in range(height):
g=img[j,i]
img[j,i]=b[g]
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我正在附加图像这是我使用过的图像
解决方案
均衡步骤的实施有些不正确。概率分布函数 (PDF) 的计算应该取决于 bin 的数量而不是图像宽度(尽管在这种特定情况下它们是相等的)。请参阅以下代码以及均衡步骤的正确实现。
import numpy as np
import cv2
path = "fingerprint256by256.pgm"
img = cv2.imread(path,0)
#To display image before equalization
cv2.imshow('image',img)
cv2.waitKey(0)
a = np.zeros((256,),dtype=np.float16)
b = np.zeros((256,),dtype=np.float16)
height,width=img.shape
#finding histogram
for i in range(width):
for j in range(height):
g = img[j,i]
a[g] = a[g]+1
print(a)
#performing histogram equalization
tmp = 1.0/(height*width)
b = np.zeros((256,),dtype=np.float16)
for i in range(256):
for j in range(i+1):
b[i] += a[j] * tmp;
b[i] = round(b[i] * 255);
# b now contains the equalized histogram
b=b.astype(np.uint8)
print(b)
#Re-map values from equalized histogram into the image
for i in range(width):
for j in range(height):
g = img[j,i]
img[j,i]= b[g]
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在 Ubuntu 14.04 上使用 Python 3.4 和 OpenCV 3.4 进行测试和验证。
推荐阅读
- git - Jenkins Git fetch 引用旧提交
- wordpress - 添加rest_post_query后无法获取所有帖子
- javascript - 如何在页面加载后显示组件?
- dart - 无法使用飞镖:数学随机
- ajax - 使用 Ajax 调用从数据库 laravel 中获取数据
- python - 需要我的 pyqt5 按钮问题的想法
- javascript - FadeIn 后的滚动问题
- node.js - 错误:passport.initialize() 中间件未使用 | 在数据库中创建用户但给出此错误
- java - 引起:java.lang.NullPointerException:尝试使用我的按钮调用虚拟方法
- reactjs - 为 Solidity 项目构建 React 前端