OpenCV——直方图均衡化equalize_hist与直方图比较(衡量图像相似——明暗角度)

原图:
原图
全局直方图均衡化:
直方均衡
在这里插入图片描述

clahe,局部直方图均衡化:
clahe
在这里插入图片描述
直方图比较:
图1:
在这里插入图片描述
图2:
在这里插入图片描述
直方图比较结果:
巴氏距离为:0.09168121741644489, 相关度为:0.9793654472068899, 卡方距离为:26024.95389270589

代码部分:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt


def equalize_hist(image):
    # 全局直方图均衡化,用于增强对比度
    # 只能处理灰度图像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    plt.hist(gray.ravel(), 256, [0, 256], color="red")
    dst = cv.equalizeHist(gray)
    plt.hist(dst.ravel(), 256, [0, 256], color="yellow")
    plt.show()
    cv.imshow("equalize_hist", dst)


def clahe_demo(image):
    # 局部直方图均衡化
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    plt.hist(gray.ravel(), 256, [0, 256], color="red")
    clahe = cv.createCLAHE(clipLimit=5.0, tileGridSize=(8, 8))
    dst = clahe.apply(gray)
    plt.hist(dst.ravel(), 256, [0, 256], color="yellow")
    plt.show()
    cv.imshow("clahe", dst)


def create_rgb_hist(image):
    # 生成一个sparse的色彩直方图
    h, w, c = image.shape
    rgbHist = np.zeros([16*16*16, 1], np.float32)
    # 将每种颜色的亮度值分为16组
    bsize = 256 / 16
    for row in range(h):
        for col in range(w):
            # 得到该像素点的颜色值
            b = image[row, col, 0]
            g = image[row, col, 0]
            r = image[row, col, 0]
            # 计算该像素值在直方图中的位置(稀疏直方图)
            index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize)
            # 数量加1
            rgbHist[np.int(index), 0] += 1
    return rgbHist


def hist_compare_demo(image1, image2):
    hist1 = create_rgb_hist(image1)
    hist2 = create_rgb_hist(image2)
    """
    cv.compareHist:
        src1:参与比较的图片1
        src2:参与比较的图片2
        method:比较方法,多种可选
        注意:对于src1与src2可以是1,2或者3维的直方图,可以是高密度的也可以是稀疏的
        但是超过了3维后,可能就会出现aliasing and sampling problems“混叠采样问题”
    """
    # 巴氏距离比较
    result1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
    # 相关性比较
    result2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
    # 卡方比较
    result3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
    print("巴氏距离为:{}, 相关度为:{}, 卡方距离为:{}".format(result1, result2 ,result3))


src = cv.imread("data/pic6.png")
cv.imshow("original", src)
# equalize_hist(src)
# clahe_demo(src)
image1 = cv.imread("data/graf1.png")
image2 = cv.imread("data/graf3.png")
hist_compare_demo(image1, image2)
# 巴氏距离为:0.09168121741644489, 相关度为:0.9793654472068899, 卡方距离为:26024.95389270589


cv.waitKey(0)
cv.destroyAllWindows()
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 可以使用cv2和numpy来实现图像直方图均衡化,示例代码如下:import cv2 import numpy as npimg = cv2.imread('img.jpg') img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)# equalize the histogram of the Y channel img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])# convert the YUV image back to RGB format img_output = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)cv2.imwrite('img_equalized.jpg',img_output) ### 回答2: 图像直方图均衡化是一种用于增强图像对比度的图像处理技术。在Python中,可以使用OpenCV库中的cv2模块和NumPy库来实现图像直方图均衡化。 首先,需要导入cv2和numpy模块: import cv2 import numpy as np 接下来,读取要处理的图像: image = cv2.imread("image.jpg", 0) 将图像转换为灰度图像,即将图像的通道数变为1。 然后,使用cv2.equalizeHist()函数进行图像直方图均衡化equalized_image = cv2.equalizeHist(image) 最后,显示原图和均衡化后的图像: cv2.imshow("Original Image", image) cv2.imshow("Equalized Image", equalized_image) cv2.waitKey(0) cv2.destroyAllWindows() 执行代码后,会显示原始图像直方图均衡化后的图像直方图均衡化的原理是将图像的灰度级进行重新映射,使得灰度级分布更加均匀,从而增强图像的对比度。这种技术广泛应用于图像处理、计算机视觉和机器学习等领域。 希望以上回答对您有帮助。 ### 回答3: 图像直方图均衡化是一种通过调整图像像素值的方法,来提高图像的对比度和视觉效果的技术。在Python中使用cv2和numpy库可以很方便地实现图像直方图均衡化。 首先,我们需要导入cv2和numpy库: ```python import cv2 import numpy as np ``` 然后,我们可以使用cv2中的`cv2.imread()`函数读取一张图像,并将其转换为灰度图像: ```python image = cv2.imread('input_image.jpg') gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) ``` 接下来,我们可以使用numpy中的`numpy.histogram()`函数计算图像直方图: ```python hist, bins = np.histogram(gray_image.flatten(), 256, [0, 256]) ``` 然后,我们可以使用numpy中的`numpy.cumsum()`函数计算直方图的累积和: ```python cdf = hist.cumsum() ``` 接着,我们可以使用`np.ma.masked_equal()`函数将直方图中的零值掩盖,并标准化累积和: ```python cdf_normalized = cdf * hist.max() / cdf.max() cdf_m = np.ma.masked_equal(cdf, 0) cdf_m = (cdf_m - cdf_m.min()) * 255 / (cdf_m.max() - cdf_m.min()) ``` 最后,我们可以使用numpy中的`numpy.ma.filled()`函数将掩盖的零值填充回直方图,并应用均衡化后的像素值到原始图像上: ```python equ_image = cdf_m[gray_image] ``` 可以将均衡化后的图像展示出来: ```python cv2.imshow('Original Image', gray_image) cv2.imshow('Equalized Image', equ_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上就是使用cv2和numpy库实现图像直方图均衡化的步骤。通过将每个像素的值根据直方图的均匀分布进行调整,可以提高图像的对比度和视觉效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值