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) #保存图片在当前目录下
- 显示结果
原始图片
直方图均衡化后
- 但是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)
- 原来图片
直方图均衡化后