python实现图像增强_python基于opencv实现图像增强代码示例

本文详细介绍了如何使用Python和OpenCV库进行图像增强,包括计算灰度直方图、线性变换、直方图正规化、伽玛变换和直方图均衡化等方法,附带完整代码示例,有助于提升图像的对比度和清晰度。
摘要由CSDN通过智能技术生成

本篇文章小编给大家分享一下python基于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()

运行结果

65e4c4d58b0d791475373893303dab84.png

7cf48d1a1481b0a5cab5b5d3df5f229a.png

线性变换

线性变换的公式为:

7e6af1601b6527a8e22bb1a3ec2e9c2f.png

图像的线性变换无疑就是利用矩阵的乘法就行线性变换,比如一个矩阵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()

运行结果:

529ac65ec5315487c1142b96e7927e97.png

灰度级范围越大就代表对比度越高,反之对比度越低视觉上清晰度就越低。我们通过a=2的线性对比度拉伸将灰度级范围扩大到[0,255]之间,如上图我们改变灰度级的范围后图像变的清晰。

直方图正规化

将图像O中的最小灰度级记为OminOmin,最大灰度级记为OmaxOmax,假如输出的图像P的灰度级范围为[Pmin,PmaxPmin,Pmax],则O 与 P的关系为:

98ec6db94ddd2f12a43b8eb4ca347d0a.png

其中P(r,c)就代表P的第r行第c列的灰度值。这个过程就是直方图的正规化。我们一般令P的范围是[0,255],所以直方图的正规化是在求a,b变换的值的方法,我们可以得到:

076efa75c54524e57f9cd694ab7d1a49.png

下面我们使用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()

494c9d845158448f421cd842b08fc476.png

e3062ee7f2e37a061dc010a7a13832b8.png

伽玛变换

将一张图的灰度值归至[0,1]后,对于8位图来说,除以255即可。伽玛变换就是令O(r,c)=I(r,c)γI(r,c)γ,0≤r

当γγ等于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()

运行结果:

3a346e017111f179752417e98b3d1245.png

直方图的均衡化

计算图像的灰度直方图

计算灰度直方图的累加直方图

根据累加的直方图和直方图均衡化的原理得到输入灰度级与输出灰度级之间的映射关系

使用循环的方式得到输出图像的每一个像素的灰度级

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

运行结果:

6b05736a3b7492c1f57a5103d1585ba2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值