网站做兼容处理怎么设置,北京网站定制设计开发公司,wordpress 默认模板,济南营销型网站公司直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分配图像中的像素值#xff0c;使得图像的像素值分布更加均匀#xff0c;增强图像的对比度#xff0c;从而改善图像的视觉效果。
直方图均衡化的过程如下#xff1a;
灰度转换#xff1a;如果图像是彩色…直方图均衡化是一种用于增强图像对比度的图像处理技术。它通过重新分配图像中的像素值使得图像的像素值分布更加均匀增强图像的对比度从而改善图像的视觉效果。
直方图均衡化的过程如下
灰度转换如果图像是彩色图像则首先需要将其转换为灰度图像。这可以通过将彩色图像的RGB通道值平均或权重化来实现得到一个表示亮度的灰度图像。统计直方图对于灰度图像统计每个像素值的频数生成原始图像的直方图。直方图表示了不同像素值的数量分布。计算累积分布函数通过计算原始图像的累积分布函数可以得到每个像素值的累积概率分布即小于等于该像素值的概率。可以通过对直方图进行归一化和累加操作得到。映射像素值根据每个像素值的累积概率分布映射出新的像素值即将概率乘以255得到均衡化后的像素值。像素重新映射对于原始图像中的每个像素根据映射将其像素值替换为均衡化后的像素值。生成均衡化后的图像根据重新映射的像素值生成均衡化后的图像。均衡化后的图像在直方图上将有更平坦的分布从而提高了图像的对比度。
可以直接调用openCV的库函数实现图像的直方图均衡化
cv2.equalizeHist(img) 可以写一个完整的测试代码如下
import matplotlib.pyplot as plt
import cv2img cv2.imread(OIP.jpg)
img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.hist(img.ravel(), bins256)
plt.title(origin)
plt.show() # 原始直方图
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.title(origin)
plt.imshow(img)
plt.show() # 原始灰度图img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img cv2.equalizeHist(img)
plt.hist(img.ravel(), bins256)
plt.title(systemEqualize)
plt.show() # 均衡化直方图
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.title(systemEqualize)
plt.show() # 均衡化灰度图 在这里我们手动实现一个图像的直方图均衡化不调用库函数
首先读取一张照片并将其转化为灰度图
img cv2.imread(OIP.jpg)
img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
然后计算图像的直方图并计算直方图的累积分布
hist cv2.calcHist([img], [0], None, [256], [0, 256])
cdf hist.cumsum()
再计算像素值的累积分布概率并根据累积分布概率映射出新的像素值根据该映射重新分配原图像的像素值根据插值操作可以很方便的进行一一映射这个interp函数非常的讲究我研究了半天还是没有看懂它的作用直到后来看到某位大佬的解说才醍醐灌顶恍然大悟——interpret(x,xp,yp)以xp和yp构造映射函数f返回f(x)这就让我们的像素值映射变得简单
mapPixel 255 * cdf / cdf[-1]
img numpy.interp(img.ravel(), range(256), mapPixel).reshape(img.shape)
最后输出均衡化的图像以及均衡化的直方图由于像素值是8位表示的在刚才的计算过程中会使用64位进行存储因此还需要对图像的像素值进行一下转换一下
img cv2.convertScaleAbs(img)
plt.hist(img.ravel(), bins256)
plt.title(myEqualize)
plt.show() # 均衡化直方图
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.title(myEqualize)
plt.show() # 均衡化灰度图
衡化后的图像的直方图如图所示其中左图为OpenCV库函数均衡化的效果右图是我们手动实现均衡化的效果可见都达到了将原图的像素值均匀分开的效果 均衡化后的图像如图所示其中左图为OpenCV库函数均衡化的效果右图是我们手动实现均衡化的效果可知二者效果基本相同与原图相比均衡化后的图像对比度提高了其中云层增加了更多的细节看起来更清晰了一些 完整代码如下
import matplotlib.pyplot as plt
import cv2
import numpyimg cv2.imread(OIP.jpg)
img cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hist cv2.calcHist([img], [0], None, [256], [0, 256])
cdf hist.cumsum()
mapPixel 255 * cdf / cdf[-1]
img numpy.interp(img.ravel(), range(256), mapPixel).reshape(img.shape)
img cv2.convertScaleAbs(img)
plt.hist(img.ravel(), bins256)
plt.title(myEqualize)
plt.show() # 均衡化直方图
img cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.title(myEqualize)
plt.show() # 均衡化灰度图