python基于opencv实现图像增强
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python基于opencv实现图像增强
为了得到更加清晰的图像我们需要通过技术对图像进⾏处理,⽐如使⽤对⽐度增强的⽅法来处理图像,对⽐度增强就是对图像输出的灰度级放⼤到指定的程度,获得图像质量的提升。
本⽂主要通过代码的⽅式,通过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()
运⾏结果
线性变换
线性变换的公式为:
图像的线性变换⽆疑就是利⽤矩阵的乘法就⾏线性变换,⽐如⼀个矩阵I ,2I,3I (np.unt8 ndarry类型就是unt8类型)就是⼀个矩阵的变换.
import cv2
import numpy as np
import sys
if __name__=="__main__":
img = cv2.imread("../img/ae.jpg",cv2.IMREAD_GRAYSCALE)
a=2
#线性变换定义float类型
O = float(a)*img
#数据截取如果⼤于255 取 255
O[0>255] = 255
#数据类型的转换
O = np.round(O)
O = O.astype(np.uint8)
cv2.imshow("img",img)
cv2.imshow('enhance',O)
cv2.waitKey(0)
cv2.destroyAllWindows()
运⾏结果:
灰度级范围越⼤就代表对⽐度越⾼,反之对⽐度越低视觉上清晰度就越低。
我们通过a=2的线性对⽐度拉伸将灰度级范围扩⼤到[0,255]之间,如上图我们改变灰度级的范围后图像变的清晰。
直⽅图正规化
将图像O中的最⼩灰度级记为OminOmin,最⼤灰度级记为OmaxOmax,假如输出的图像P的灰度级范围为
[Pmin,PmaxPmin,Pmax],则O 与 P的关系为:
其中P(r,c)就代表P的第r⾏第c列的灰度值。
这个过程就是直⽅图的正规化。
我们⼀般令P的范围是[0,255],所以直⽅图的正规化是在求a,b变换的值的⽅法,我们可以得到:
下⾯我们使⽤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()
伽玛变换
将⼀张图的灰度值归⾄[0,1]后,对于8位图来说,除以255即可。
伽玛变换就是令O(r,c)=I(r,c)γI(r,c)γ,0≤r<H,0≤≤r<H,0≤c<W.当γγ等于1时图像不发⽣变换,⽽当γγ⼤于0且⼩于1时就可以增强图像的对⽐度,相反的当γγ⼤于1时就可以使图像对⽐度降低。
以下是伽玛变换在OpenCV中的实现:
import cv2
import numpy as np
import sys
# 伽玛变换 power函数实现幂函数
if __name__ == "__main__":
img = cv2.imread("../img/ae.jpg", cv2.IMREAD_GRAYSCALE)
# 归1
Cimg = img / 255
# 伽玛变换
gamma = 0.5
O = np.power(Cimg,gamma)
#效果
cv2.imshow('img',img)
cv2.imshow('O',O)
cv2.waitKey(0)
cv2.destroyAllWindows()
运⾏结果:
直⽅图的均衡化
计算图像的灰度直⽅图
计算灰度直⽅图的累加直⽅图
根据累加的直⽅图和直⽅图均衡化的原理得到输⼊灰度级与输出灰度级之间的映射关系
使⽤循环的⽅式得到输出图像的每⼀个像素的灰度级
import cv2
import numpy as np
from enhance.GrayHist import calcGrayHist
#直⽅图的均衡化
if __name__ == "__main__":
image = cv2.imread("../img/ae.jpg", cv2.IMREAD_GRAYSCALE)
rows,cols = image.shape
#计算灰度直⽅图
grayHist = calcGrayHist(image)
#计算累加灰度直⽅图
zeroCumuMoment = np.zeros([256], np.uint32)
for p in range(256):
if p == 0:
zeroCumuMoment[p] = grayHist[0]
else:
zeroCumuMoment[p] = zeroCumuMoment[p-1] + grayHist[p]
#根据累加的灰度直⽅图得到输⼊与输出灰度级之间的映射关系
output = np.zeros([256],np.uint8)
cofficient = 256.0/(rows*cols)
for p in range(256):
q = cofficient * float(zeroCumuMoment[p])-1
if q >=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()
运⾏结果:
以上就是python 基于opencv实现图像增强的详细内容,更多关于python opencv的资料请关注其它相关⽂章!。