opencv-python(十):直方图

直方图是对图像像素亮度值的统计,能很直观反应图像在亮度上的分布情况。

1、计算直方图可以利用Opencv的calcHist()和numpy的histogram进行计算

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

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

# cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
hist = cv.calcHist([img], [0], None, [256], [0, 256])

# numpy
# hist, bins = np.histogram(img.raval(), 256, [0, 256])

plt.subplot(131), plt.imshow(img, cmap = 'gray'),
plt.title('Origin'), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.hist(img.ravel(), 256, [0, 256])
plt.title('Hist Matplotlib')
plt.subplot(133), plt.plot(hist)
plt.xlim([0, 256]), plt.title('Hist Nomal')

plt.show()

效果如下:



2、计算直方图时,使用Mask,计算图像中感兴趣区域的直方图

# coding=utf-8
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# Use Mask
img = cv.imread('building.jpg', 0)
print(img.shape)

# create mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:500, 100:800] = 255
# dst=cv.bitwise_and(src1, src2[, dst[, mask]])
# dst(I)=src1(I)∧src2(I)if mask(I)≠0
masked_img = cv.bitwise_and(img, img, mask = mask)

# caculate histogram
hist_full = cv.calcHist([img], [0], None, [256], [0, 256])
hist_mask = cv.calcHist([img], [0], mask, [256], [0, 256])

plt.subplot(221), plt.imshow(img, 'gray')
plt.title('Origin'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(mask,'gray')
plt.title('Mask'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.title('Mask image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])
plt.show()

效果如下:


3、直方图均衡化

直方图均衡化是针对光照不均匀十分有效的手段之一,主要是通过统计当前图片中像素的分布情况,调整图片中每个像素强度值。

equ = cv.equalizeHist(img)
res = np.hstack((img,equ)) #stacking images side-by-side



猜你喜欢

转载自blog.csdn.net/sinat_31425585/article/details/80248050