Python计算机视觉(一)

本文将持续更新 21.3.28

Python计算机视觉(一) 实现数字图像处理

本文是课堂作业blog的第一篇,主要记录课程作业,同时分享一些体会。
这次我使用的是Python+OpenCV

文章目录

  • Python计算机视觉(一) 实现数字图像处理
    • 读取并显示图像
      • PIL读取图像
      • OpenCV读取
    • 绘制直方图
    • 直方图均衡化
      • 为什么要直方图均衡化
      • OpenCV实现直方图均衡化
    • 高斯滤波

读取并显示图像

PIL读取图像

from PIL import Image
img = Image.open('pika.jpg')
plt.imshow(img)
plt.show()

Python计算机视觉(一)_第1张图片

OpenCV读取

import numpy as np
import cv2 as cv
img = cv2.imread("pika.jpg", 0) # 0代表读取灰度图像
cv2.imshow("gray", img)
cv.waitKey(0)

Python计算机视觉(一)_第2张图片

绘制直方图

直方图计算
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])

输出的结果都是一样的
Python计算机视觉(一)_第3张图片

不过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实现直方图均衡化

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")

Python计算机视觉(一)_第4张图片

高斯滤波

你可能感兴趣的:(Python计算机视觉(一))