本文将持续更新 21.3.28
本文是课堂作业blog的第一篇,主要记录课程作业,同时分享一些体会。
这次我使用的是Python+OpenCV
from PIL import Image
img = Image.open('pika.jpg')
plt.imshow(img)
plt.show()
import numpy as np
import cv2 as cv
img = cv2.imread("pika.jpg", 0) # 0代表读取灰度图像
cv2.imshow("gray", img)
cv.waitKey(0)
直方图计算
Python环境下,有很多工具可以计算和绘制直方图。例如numpy中的 np.histogram(),
hist,bins = np.histogram(img.ravel(),256,[0,256])
和OpenCV的cv.calcHist(),
hist = cv.calcHist([img],[0],None,[256],[0,256])
不过Opencv-Python官方文档推荐使用效率最高的cv.calcHist()
Numpy还有另一个函数np.bincount(),它比np.histogram()快10倍左右。因此,对于一维直方图,您可以更好地尝试一下。不要忘记在np.bincount中设置minlength = 256。 例如,hist = np.bincount(img.ravel(),minlength = 256)
OpenCV函数比np.histogram()快(大约40倍)。因此,请坚持使用OpenCV功能。
考虑一个图像,其像素值仅限制在特定的值范围内。例如,较亮的图像会将所有像素限制在较高的值。但是,好的图像将具有来自图像所有区域的像素。因此,您需要将此直方图拉伸到两端,简单来说,这就是直方图均衡化的作用。直方图均衡化通常用来提高图像的对比度。
OpenCV的cv.equalizeHist()函数可以实现图像的直方图均衡化
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
img = cv.imread('test.jpg',0)
equ = cv.equalizeHist(img)
res = np.hstack((img,equ)) #stacking images side-by-side
cv.imwrite('res.png',res)
此外,使用cv.calcHist()可以直观体现出均衡化前后直方图的变化
hist1 = cv.calcHist([img],[0],None,[256],[0,256])
hist2 = cv.calcHist([equ],[0],None,[256],[0,256])
plt.plot(hist1,'blue')
plt.plot(hist2,'orange')
plt.legend(('sourceHist', 'equalizeHist'), loc='upper right')
plt.savefig(fname="hist.png")