opencv python 实现灰度图像和彩色图像直方图全局均衡化和自适应均衡化

 首先进行简单的灰度图像的全局均衡化和自适应均衡化

import cv2 as cv
import numpy as np

img = cv.imread('cun.jpg',0)

# 全局直方图均衡化
img1 = cv.equalizeHist(img)
# 自适应直方图均衡化
clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
cll = clahe.apply(img)

res = np.hstack((img,img1,cll))
cv.imwrite("res.jpg",res)

以下图像来自于网络:

 接下来进行同一张照片彩色图像的直方图全局均衡化和自适应均衡化

算法的思想很简单:利用人眼对图像的强度信息更加敏感的特点,将RGB彩色图像先转换到YPbPr空间,然后只对亮度通道进行全局直方图均衡化和自适应直方图均衡化,最后再将亮度通道和PbPr通道合并形成彩色图像,然后再转换回RGB空间中。

import numpy as np
import cv2 as cv

# 彩色图像全局直方图均衡化
def hisEqulColor1(img):
	# 将RGB图像转换到YCrCb空间中
    ycrcb = cv.cvtColor(img, cv.COLOR_BGR2YCR_CB)
    # 将YCrCb图像通道分离
    channels = cv.split(ycrcb)
    # 对第1个通道即亮度通道进行全局直方图均衡化并保存
    cv.equalizeHist(channels[0],channels[0])
    # 将处理后的通道和没有处理的两个通道合并,命名为ycrcb
    cv.merge(channels,ycrcb)
    # 将YCrCb图像转换回RGB图像
    cv.cvtColor(ycrcb, cv.COLOR_YCR_CB2BGR, img)
    return img


# 彩色图像进行自适应直方图均衡化,代码同上的地方不再添加注释
def hisEqulColor2(img):
    ycrcb = cv.cvtColor(img, cv.COLOR_BGR2YCR_CB)
    channels = cv.split(ycrcb)

    # 以下代码详细注释见官网:
    # https://docs.opencv.org/4.1.0/d5/daf/tutorial_py_histogram_equalization.html
    clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))
    clahe.apply(channels[0],channels[0])

    cv.merge(channels,ycrcb)
    cv.cvtColor(ycrcb, cv.COLOR_YCR_CB2BGR, img)
    return img

img = cv.imread('cun.jpg')
img1 = img.copy()
img2 = img.copy()

res1 = hisEqulColor1(img1)
res2 = hisEqulColor2(img2)

res = np.hstack((img,res1,res2))
cv.imwrite('res1.jpg',res)

 以下图像来自于网络

 

Python中,有两种常用的直方图均衡化方法:全局直方图均衡化自适应直方图均衡化。 1. 全局直方图均衡化全局直方图均衡化是将整个图像的直方图拉伸到整个灰度范围内,以增强图像的对比度。在OpenCV中,可以使用`cv2.equalizeHist()`函数来实现全局直方图均衡化。 ```python import cv2 # 读取图像 image = cv2.imread('image.jpg', 0) # 以灰度模式读取图像 # 进行全局直方图均衡化 equalized_image = cv2.equalizeHist(image) # 显示结果 cv2.imshow('Equalized Image', equalized_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 2. 自适应直方图均衡化自适应直方图均衡化是根据局部区域的直方图进行均衡化,以增强局部细节并保持整体亮度的一致性。在OpenCV中,可以使用`cv2.createCLAHE()`函数创建一个自适应直方图均衡化对象,并使用它来进行均衡化。 ```python import cv2 # 读取图像 image = cv2.imread('image.jpg', 0) # 以灰度模式读取图像 # 创建自适应直方图均衡化对象 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) # 可根据需要调整clipLimit和tileGridSize参数 # 进行自适应直方图均衡化 equalized_image = clahe.apply(image) # 显示结果 cv2.imshow('Equalized Image', equalized_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这两种方法都可以用来增强图像的对比度和细节,但自适应直方图均衡化通常在处理具有不均匀光照的图像时效果更好。您可以根据具体情况选择适合的方法来进行图像处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值