Python计算机视觉编程_01

基本的图像操作和处理

  • 前言
  • 1.图像直方图
    • 1.1.原理
    • 1.2.结果演示
  • 2.高斯滤波
    • 2.1.原理
    • 2.2.结果演示
  • 3.直方图均衡化
    • 3.1.原理
    • 3.2.结果演示
  • 后记

前言

本篇博客介绍在vscode中使用opencv进行图像处理的基本操作,使用的语言为python,vscode中按照python可以参考我以前写的这篇博客:vscode中配置python环境
至于在vscode导入opencv包就请各位自行百度解决(其实是我忘记当初怎么装的了 )。

1.图像直方图

1.1.原理

谈到图像处理就不得不提图像直方图,一般来说,图像直方图是指灰度直方图,即图像通过灰度变换后得到的灰度图像的像素值的分布。
灰度图像图是只针对灰度图像,平常接触的彩色图像都是由三个灰度图像(Red,Green,Blue)叠加而成,可以说每个灰度图像都有自己的灰度直方图。
那么这个直方图有什么用呢,从表面来看,直方图可以直观地表示这幅图像像素点的分布情况,可以很明显的看出一幅图像的明暗程度,缺点也很明显,丢失了图像的图片特征和方向。
不过在谈到一幅图像的直方图都是指这张彩色图像的灰度直方图,这就需要将三张灰度图像化成一张,这里我采用opencv中的cvtColor函数来进行灰度化。

1.2.结果演示

这是我用手机拍的学校图片。
Python计算机视觉编程_01_第1张图片
为什么是晚上呢,因为白天拍的照片大小超标了,越亮的照片像素值越高,所占的容量也越大,所以从目前来看,这张图片的直方图应该是偏左边(即靠近原点)的。让我们来测试看看。

from cv2 import waitKey
import numpy as np
import matplotlib.pyplot as plt
import cv2

img=cv2.imread('D:\\vscode\\python\\test1.jpg')
#cvtColor函数(变换对象,转换系数),COLOR_BGR2GRAY的公式为Gray = 0.1140*R + 0.5870*G + 0.2989*B
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#额外命名窗口,解决图片过大无法显示的问题
cv2.namedWindow('image',0)
cv2.imshow('image',img)
#plt直接绘制直方图
plt.hist(img.ravel(),256); 
plt.show()
cv2.waitKey(0)

Python计算机视觉编程_01_第2张图片
我们可以很明显的看到,照片的图像直方图和我们设想中的一样,集中在低像素的区域[0,100],拍的图片很明显偏暗了(因为是晚上

2.高斯滤波

2.1.原理

高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
一维高斯分布:
在这里插入图片描述
二维高斯分布:
在这里插入图片描述
不太理解的同学可以百度搜索卷积核,有大把的博客可以参考。

2.2.结果演示

from cv2 import waitKey
import numpy as np
import matplotlib.pyplot as plt
import cv2
#sss
img=cv2.imread('D:\\vscode\\python\\test1.jpg')
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#采用9*9的卷积核
img=cv2.GaussianBlur(img,(9,9),0)
cv2.namedWindow('image',0)
cv2.imshow('image',img)

plt.hist(img.ravel(),256); 
plt.show()
cv2.waitKey(0)

Python计算机视觉编程_01_第3张图片
很明显,灰度图像的变化很难通过肉眼观看得出结论,直方图则很好的反应了图像的变化。

3.直方图均衡化

3.1.原理

图像灰度变换中一个非常有用的方法就是直方图均衡化,即将一幅图像的灰度直方图变平,使变换后的图像中的每个灰度值的分布概率相同。这种方法可以很明显的增强图像的对比度。
而为了取得比较好的映射效果,我们采用累积分布函数(cumulative distribution function,cdf,将像素值的范围映射到目标范围的归一化操作)

3.2.结果演示

from cv2 import waitKey
import numpy as np
import matplotlib.pyplot as plt
import cv2

img=cv2.imread('D:\\vscode\\python\\test1.jpg')
img=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#采用equalizeHist函数
img=cv2.equalizeHist(img)
cv2.namedWindow('image',0)
cv2.imshow('image',img)

plt.hist(img.ravel(),256); 
plt.show()
cv2.waitKey(0)

Python计算机视觉编程_01_第4张图片
很明显,效果显著

后记

本篇博客是python计算机视觉编程的开篇,有疑问的同学可以在评论区提出,互相交流学习,本次博客写的内容都比较基础,也请各位多提意见,我会参考并优化。

你可能感兴趣的:(python,计算机视觉,opencv)