python+OpenCV 彩色直方图均衡化

about

本文参考了

  • sunny2038同学的OpenCV Python教程(1、图像的载入、显示和保存)
  • jnulzl同学的openCV—Python(8)—— 图像直方图及其直方图-均衡化
  • OpenCV documentationHistograms
  • StackOverflow的Error using cv2.equalizeHist
  • StackOverflow的Histogram equalization not working on color image - OpenCV
  • PERPETUAL ENIGMA同学的Histogram Equalization Of RGB Images

灰色图片直方图均衡化

  • 代码实现
import numpy as np
import cv2

im = cv2.imread('vi.jpg',0)         #当前目录下的图片:vi.png
cv2.imshow('image1', im)
cv2.waitKey(0)

eq = cv2.equalizeHist(im)         #灰度图片直方图均衡化
cv2.imshow('image2',eq)
cv2.waitKey(0)

cv2.imwrite('vi2.jpg',eq)      #保存图片在当前目录下
  • 显示结果

原始图片

python+OpenCV 彩色直方图均衡化_第1张图片
vi.jpg

直方图均衡化后

python+OpenCV 彩色直方图均衡化_第2张图片
vi2.jpg
  • 但是cv2.equalizeHist()只提供灰度值图片的处理,当把上面的图片换成RGB图片时,就会报错了。
... 
eq = cv2.equalizeHist(image)
cv2.error: /usr/local/opencv-3.1.0/modules/imgproc/src/histogram.cpp:3687: error: (-215) _src.type() == CV_8UC1 in function equalizeHist
  • 网上一查:
    有同学说,

cv2.equalizeHist only works on grayscale ( 1 channel ) images

  • 官网是这么描述的:

Equalizes the histogram of a grayscale image.

  • 解决方案请往下看

彩色图片直方图均衡化

有兴趣的同学可以简单看下这么做的原理是什么:

  • PERPETUAL ENIGMA同学的Histogram Equalization Of RGB Images

  • 代码实现

import numpy as np
import cv2


def hisEqulColor(img):
    ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
    channels = cv2.split(ycrcb)
    print len(channels)
    cv2.equalizeHist(channels[0], channels[0])
    cv2.merge(channels, ycrcb)
    cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR, img)
    return img

im = cv2.imread('lena.jpg')
cv2.imshow('im1', im)
cv2.waitKey(0)

eq = hisEqulColor(im)
cv2.imshow('image2',eq )
cv2.waitKey(0)
cv2.imwrite('lena2.jpg',eq)
  • 原来图片
python+OpenCV 彩色直方图均衡化_第3张图片
lena.jpg

直方图均衡化后

python+OpenCV 彩色直方图均衡化_第4张图片
lena2.jpg

你可能感兴趣的:(python+OpenCV 彩色直方图均衡化)