使用pycharm进行图像的处理
Posted 差不多女生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用pycharm进行图像的处理相关的知识,希望对你有一定的参考价值。
使用pycharm开发环境和python语言对图像进行处理,如直方图、高斯滤波、直方图均衡化等
图像的灰度直方图
灰度直方图是关于灰度级分布的函数,将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。
如果将图像总像素亮度(灰度级别)看成是一个随机变量,则其分布情况就反映了图像的统计特性灰度直方图能够很直观的展示图像中灰度级的整体分布情况,对图像的后续处理有很好的指导作用。
直方图处理概念:灰度级范围为[0,L-1]的数字图像的直方图是离散函数h(rk)=nk,其中rk是第k级灰度值,nk是图像中灰度为rk的像素个数。在实践中,经常用乘积MN表示的图像像素的总数除它的每个分量来归一化直方图,通常M和N是图像的行和列的维数。因此,归一化后的直方图由p(rk)=nk/MN给出,其中k=0,1,…,L-1。简单来说,p(rk)是灰度级rk在图像中出现的概率的一个估计。归一化直方图的所有分量之和应等于1。
在直方图中,暗图像集中分布在灰度级的低端;亮图像集中分布在灰度级的高端。低对比度图像具有较窄的直方图,且集中于灰度级的中部;高对比度图像的直方图分量则覆盖了很宽的灰度级范围。
import cv2
import matplotlib.pyplot as plt
print(plt.get_backend())
#plt.use(‘module://backend_interagg’)
src = cv2.imread('1.jpg',0)
srcl = cv2.resize(src,(300,300))
cv2.imshow('srcl',src)
src1 = src.ravel()#将图像处理成一维数组
print(src1)
plt.hist(src1,256)
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()
高斯滤波
高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。
高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的,为1。而高斯滤波器的模板系数,随着距离模板中心距离的增大,系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器而言,对图像模糊程度较小,更能保持图像的整体细节。
二维高斯分布
我们不必纠结于系数
,因为它只是一个常数!并不会影响互相之间的比例关系,而且最终都要进行归一化,所以在实际计算时我们忽略它而只计算后半部分
其中(x,y)为掩膜内任一点的坐标,(ux,uy)为掩膜内中心点的坐标,在图像处理中可认为是整数;σ是标准差。
import cv2
img = cv2.imread('3.jpg')
# (3, 3)表示高斯滤波器的长和宽都为3,1.3表示滤波器的标准差
out = cv2.GaussianBlur(img, (3, 3), 0)
cv2.imwrite('2.jpg', out)
cv2.imshow('result', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:
高斯滤波后图:
直方图均衡化
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
基本思想:把原始图的直方图变换为均匀分 布的形式,这样就增加了像素灰度值的动态 范围,从而达到增强图像整体对比度的效果
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):
(1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
(2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致性。
累积分布函数(cumulative distribution function,CDF)即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。此时的直方图均衡化映射函数为:
gk = EQ(fk) = (ni/n) = pf(fi) ,
(k=0,1,2,……,L-1)
上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出fk到gk的灰度映射关系。在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。
参考资料:直方图均衡化原理
import cv2
import numpy as np
img = cv2.imread("1.jpg", 1)
before = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
before1= cv2.resize(before,(400,400))
cv2.imshow("before", before1)
after = cv2.equalizeHist(before)
after1= cv2.resize(after,(400,400))
cv2.imshow("after",after1)
cv2.waitKey(0)
均衡化以前:
均衡化以后:
这些在pycharm环境中都是利用cv2自身所带的函数所完成的,因为还没学过python,所以目前还不能用自行编写函数对图像处理,后续还会不断地改进 。
以上是关于使用pycharm进行图像的处理的主要内容,如果未能解决你的问题,请参考以下文章
图像隐写基于matlab GUI DCT变换图像隐写含Matlab源码 1380期
Python遥感图像处理应用篇(二十四):Python绘制遥感图像各波段热力图(相关系数矩阵)