OpenCV Python equalizeHist彩色图像

Far*_*bdo 15 python opencv

我需要对彩色图像进行直方图均衡.

首先,我将彩色图像转换为灰色并将其赋予equalizeHist功能:

image = cv2.imread("photo.jpg")
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.equalizeHist(image)
cv2.imshow("equalizeHist", image)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

但在此之后我需要将图像转换回RGB; 我怎样才能做到这一点?

小智 36

资料来源:https: //www.packtpub.com/packtlib/book/Application-Development/9781785283932/2/ch02lvl1sec26/Enhancing%20the%20contrast%20in%20an%20image

import cv2
import numpy as np

img = cv2.imread('input.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.imshow('Color input image', img)
cv2.imshow('Histogram equalized', img_output)

cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

  • 均衡后的图像看起来很奇怪。 (5认同)
  • 你的链接坏了! (2认同)

小智 7

一种更通用的方法是将RGB值转换到另一个包含发光/强度值的空间(Luv,Lab,HSV,HSL),仅在强度平面上应用histeq并执行逆变换。


Min*_*mal 7

输入图像与均衡图像


Python代码

import cv2

def run_histogram_equalization(image_path):
    rgb_img = cv2.imread(image_path)

    # convert from RGB color-space to YCrCb
    ycrcb_img = cv2.cvtColor(rgb_img, cv2.COLOR_BGR2YCrCb)

    # equalize the histogram of the Y channel
    ycrcb_img[:, :, 0] = cv2.equalizeHist(ycrcb_img[:, :, 0])

    # convert back to RGB color-space from YCrCb
    equalized_img = cv2.cvtColor(ycrcb_img, cv2.COLOR_YCrCb2BGR)

    cv2.imshow('equalized_img', equalized_img)
    cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

解释

直方图均衡化 (HE) 是一种用于扩展强度值的统计方法。在图像处理中,HE用于提高任何图像的对比度,即使暗部更暗,亮部更亮。

对于灰度图像,每个像素由强度值(亮度)表示;这就是为什么我们可以将像素值直接提供给 HE 函数的原因。但是,对于RGB格式的彩色图像,这不是它的工作方式。RGB 的每个通道代表相关颜色的强度,而不是整个图像的强度/亮度。因此,在这些颜色通道上运行 HE 不是正确的方法

我们应该首先将图像的亮度与颜色分开,然后对亮度运行 HE。现在,已经有标准化的色彩空间,分别对亮度和颜色进行编码,如YCbCrHSV等;所以,我们可以在这里使用它们来分离然后重新合并亮度。正确的方法:

将色彩空间从RGB转换为YCbCr >> 在Y通道上运行 HE (该通道代表亮度)>> 将色彩空间转换回RGB


后记

对于HSV色彩空间,HE 应在V通道上运行。然而,YCbCrY通道比HSVV通道更能代表亮度。因此,使用YCbCr格式可为 HE 生成更正确的结果

HSV 与 YCbCr


后记2

HE技术太天真了,经常会产生奇特的颜色和小工件。这是因为它不关心异常值和像素的位置。因此,更常用的扩展如 - ?Contrast Limited Adaptive HE、Brightnesskeeping Bi-HE 等。此外,在后处理阶段执行不同的降噪功能以改善最终输出。


小智 5

您不必先将图像转换为灰度图像。您可以使用下面的方法。上面建议的解决方案使用了 YUV 颜色空间,但我将使用 HSV 颜色空间来完成此示例。

image = cv2.imread("photo.jpg")

# convert image from RGB to HSV
img_hsv = cv2.cvtColor(image, cv2.COLOR_RGB2HSV)

# Histogram equalisation on the V-channel
img_hsv[:, :, 2] = cv2.equalizeHist(img_hsv[:, :, 2])

# convert image back from HSV to RGB
image = cv2.cvtColor(img_hsv, cv2.COLOR_HSV2RGB)

cv2.imshow("equalizeHist", image)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

  • 颜色扭曲。 (5认同)

小智 5

img_yuv = cv2.cvtColor(image, cv2.COLOR_BGR2YUV)
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(2,2))
img_yuv[:,:,0] = clahe.apply(img_yuv[:,:,0])
img = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)
cv2.imshow("equalizeHist", img)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)

  • 我的朋友,如果您解释一下您的代码以及您实际上在做什么,那就太好了。 (3认同)
  • 正如 @eldesgraciado 所提到的,请为您的答案添加一些解释,维基百科 URL 并不会使它更完整。请解释一下为什么要包含该参考文献?你的参考文献与问题有什么关系?谢谢! (3认同)