OpenCV图像增强(python)
Super~me 人气:0
为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升。本文主要通过代码的方式,通过OpenCV的内置函数将图像处理到我们理想的结果。
###灰度直方图###
灰度直方图通过描述灰度级在图像矩阵中的像素个数来展示图像灰度级的信息,通过灰度直方图的统计我们可以看到每个灰度值的占有率。下面是一个灰度直方图的实现:
```
import cv2
import numpy as np
import sys
import matplotlib.pyplot as plt
#计算灰度直方图
def calcGrayHist(image):
rows,clos = image.shape
#创建一个矩阵用于存储灰度值
grahHist = np.zeros([256],np.uint64)
print('这是初始化矩阵')
print(grahHist )
for r in range(rows):
for c in range(clos):
#通过图像矩阵的遍历来将灰度值信息放入我们定义的矩阵中
grahHist[image[r][c]] +=1
print('这是赋值后的矩阵')
print(grahHist)
return grahHist
if __name__=="__main__":
image = cv2.imread("../img/aa.jpg",cv2.IMREAD_GRAYSCALE)
grahHist = calcGrayHist(image)
x_range = range(256)
plt.plot(x_range,grahHist,'-',linewidth= 3,c='k')
#设置坐标轴的范围
y_maxValue = np.max(grahHist)
plt.axis([0,255,0,y_maxValue])
#设置标签
plt.xlabel('gray Level')
plt.ylabel("number of pixels")
#显示灰度直方图
plt.show()
```
运行结果
![](https://img2020.cnblogs.com/blog/989555/202003/989555-20200307171031631-234859868.png)
![](https://img2020.cnblogs.com/blog/989555/202003/989555-20200307171131231-121563880.png)
###线性变换###
线性变换的公式为:
$$ O(r,c)=a*I(r,c)+b,0\leq r255] = 255
#数据类型的转换
O = np.round(O)
O = O.astype(np.uint8)
cv2.imshow("img",img)
cv2.imshow('enhance',O)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
运行结果:
![](https://img2020.cnblogs.com/blog/989555/202003/989555-20200307175259544-1644710083.png)
灰度级范围越大就代表对比度越高,反之对比度越低视觉上清晰度就越低。我们通过a=2的线性对比度拉伸将灰度级范围扩大到[0,255]之间,如上图我们改变灰度级的范围后图像变的清晰。
###直方图正规化###
将图像O中的最小灰度级记为$O_{min}$,最大灰度级记为$O_{max}$,假如输出的图像P的灰度级范围为[$P_{min},P_{max}$],则O 与 P的关系为:
$$ O(r,c)=\cfrac{P_{max}-P_{min}}{O_{max}-O_{min}}(O(r,c)-O_{min})+P_{min}$$
其中P(r,c)就代表P的第r行第c列的灰度值。这个过程就是直方图的正规化。我们一般令P的范围是[0,255],所以直方图的正规化是在求a,b变换的值的方法,我们可以得到:
$$ a=\cfrac{P_{max}-P_{min}}{O_{max}-O_{min}} , b=P_{min}-\cfrac{P_{max}-P_{min}}{O_{max}-O_{min}} *O_{min}$$
下面我们使用OpenCV来实现上面的理论:
```
import cv2
import numpy as np
import sys
from enhance.GrayHist import mget
if __name__=="__main__":
img = cv2.imread("../img/o3.jpg",cv2.IMREAD_GRAYSCALE)
#求出img 的最大最小值
Maximg = np.max(img)
Minimg = np.min(img)
print(Maximg, Minimg, '-----------')
#输出最小灰度级和最大灰度级
Omin,Omax = 0,255
#求 a, b
a = float(Omax - Omin)/(Maximg - Minimg)
b = Omin - a*Minimg
print(a,b,'-----------')
#线性变换
O = a*img + b
O = O.astype(np.uint8)
#利用灰度直方图进行比较 mget为GrayHist中的写方法
mget(img)
mget(O)
cv2.imshow('img',img)
cv2.imshow('enhance',O)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
![](https://img2020.cnblogs.com/blog/989555/202003/989555-20200307190548030-1740133044.png)
![](https://img2020.cnblogs.com/blog/989555/202003/989555-20200307190622835-1858485442.png)
###伽玛变换###
将一张图的灰度值归至[0,1]后,对于8位图来说,除以255即可。伽玛变换就是令O(r,c)=$I(r,c)^\gamma$,0$\leq r=0:
output[p] = np.math.floor(q)
else:
output[p] = 0
#得出均衡化图像
equalHistimg = np.zeros(image.shape,np.uint8)
for r in range(rows):
for c in range(cols):
equalHistimg[r][c] = output[image[r][c]]
cv2.imshow('image',image)
cv2.imshow('histimage',equalHistimg)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
运行结果:
![](https://img2020.cnblogs.com/blog/989555/202003/989555-20200307194430499-2001298475.png)
加载全部内容