python 基于opencv实现图像增强

作者:Superme 时间:2023-03-20 21:04:32 

为了得到更加清晰的图像我们需要通过技术对图像进行处理,比如使用对比度增强的方法来处理图像,对比度增强就是对图像输出的灰度级放大到指定的程度,获得图像质量的提升。本文主要通过代码的方式,通过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()

运行结果

python 基于opencv实现图像增强

python 基于opencv实现图像增强

线性变换

线性变换的公式为:

python 基于opencv实现图像增强

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

运行结果:

python 基于opencv实现图像增强

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

直方图正规化

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

python 基于opencv实现图像增强

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

python 基于opencv实现图像增强

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

python 基于opencv实现图像增强

python 基于opencv实现图像增强

伽玛变换

将一张图的灰度值归至[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()

运行结果:

python 基于opencv实现图像增强

直方图的均衡化

  • 计算图像的灰度直方图

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

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

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


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实现图像增强

来源:https://www.cnblogs.com/supershuai/p/12436669.html

标签:python,opencv,图像增强
0
投稿

猜你喜欢

  • 通过python顺序修改文件名字的方法

    2023-05-20 08:05:29
  • 解决mysql5中文乱码问题的方法

    2024-01-15 07:47:52
  • python爬虫用mongodb的理由

    2023-09-27 23:06:40
  • Python函数的默认参数设计示例详解

    2021-03-23 04:31:58
  • Python网络爬虫信息提取mooc代码实例

    2022-01-02 12:18:23
  • 浅谈mysqldump使用方法(MySQL数据库的备份与恢复)

    2024-01-20 16:29:23
  • Django实现自定义404,500页面教程

    2021-06-20 06:23:07
  • 浅谈MySQL触发器的原理以及使用

    2024-01-19 02:44:46
  • javascript开发经验谈

    2009-05-01 12:14:00
  • Python使用psutil对系统数据进行采集监控

    2023-03-13 07:21:19
  • JavaScript 事件参考手册

    2024-04-10 10:44:51
  • 使用MySQL内建复制功能

    2009-12-15 21:36:00
  • python切片中内存的注意事项总结

    2022-12-23 00:04:09
  • mysql学习笔记之基础知识

    2024-01-13 08:27:16
  • python实现的AES双向对称加密解密与用法分析

    2022-08-11 00:42:32
  • JS+CSS实现仿支付宝菜单选中效果代码

    2023-10-05 07:29:01
  • Python对文件操作知识汇总

    2023-02-26 11:10:59
  • 鼠标放在图片上显示大图的JS代码

    2024-04-28 10:20:08
  • MySQL数据库定时备份的实现方法

    2024-01-23 19:38:42
  • 基于SQL Server中如何比较两个表的各组数据 图解说明

    2024-01-22 06:36:03
  • asp之家 网络编程 m.aspxhome.com