Python实现图像增强
作者:lph-China
本文实例为大家分享了Python实现图像增强的具体代码,供大家参考,具体内容如下
题目描述:对于下面这幅图像(图 1),请问可以通过那些图像增强的手段,达到改善视觉效果的目的?请显示处理结果,并附简要处理流程说明。
图 1 原图
常用的图像增强方法有以下几种:
1.提高对比度
采用了线性函数对图像的灰度值进行变换。
2.Gamma校正
采用了非线性函数(指数函数)对图像的灰度值进行变换。
3.直方图均衡化
将原始图像的直方图通过积分概率密度函数转化为概率密度为1(理想情况)的图像,从而达到提高对比度的作用。直方图均衡化的实质也是一种特定区域的展宽,但是会导致整个图像向亮的区域变换。当原始图像给定时,对应的直方图均衡化的效果也相应的确定了。
4.直方图规定化
针对直方图均衡化的存在的一些问题,将原始图像的直方图转化为规定的直方图的形式。一般目标图像的直方图的确定需要参考原始图像的直方图,并利用多高斯函数得到。
5. 中值、均值滤波器
均值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。
中值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。
从图像中我们可以看出,该图片带有很多椒盐噪声,并且图像有些暗,于是我们选择中值滤波方法对图片进行处理(中值滤波对椒盐噪声具有较好效果),并提高对比度和亮度。
处理流程:
第一步:采用中值滤波方法对图像进行处理,处理后,结果如图2所示:
图2 中值滤波
第二步:Gamma校正,处理后,结果如图3所示:
图3 Gamma校正
第三步:提升对比度,亮度,处理后,结果如图4所示:
图4 对比度、亮度提升
最后输出对比图,如图5所示:
图5 效果对比图
Python代码:
#author:lph #funtion:image enhance import cv2 import numpy as np from tkinter import * from skimage import filters,exposure import matplotlib.pyplot as plt from skimage.morphology import disk from matplotlib.font_manager import FontProperties #读入图片 im = cv2.imread('./image/image.png',0) im_copy = cv2.imread('./image/image.png',0) #如果图片为空,返回错误信息,并终止程序 if im is None: print("图片打开失败!") exit() #中值滤波去噪 medStep = 3 # 设置为3*3的滤波器 def m_filter(x, y, step): """中值滤波函数""" sum_s=[] # 定义空数组 for k in range(-int(step/2),int(step/2)+1): for m in range(-int(step/2),int(step/2)+1): sum_s.append(im[x+k][y+m]) # 把模块的像素添加到空数组 sum_s.sort() # 对模板的像素由小到大进行排序 return sum_s[(int(step*step/2)+1)] for i in range(int(medStep/2),im.shape[0]-int(medStep/2)): for j in range(int(medStep/2),im.shape[1]-int(medStep/2)): im_copy[i][j] = m_filter(i, j, medStep) # 用模板的中值来替代原像素的值 cv2.imshow("Median",im_copy) #Gamma校正 img3 = exposure.adjust_gamma(im_copy,1.05) cv2.imshow("Gamma", img3) #对比度、亮度增强 def Contrast_and_Brightness(alpha,beta,img): """使用公式f(x)=α.g(x)+β""" #α调节对比度,β调节亮度 blank = np.zeros(img.shape,img.dtype)#创建图片类型的零矩阵 dst = cv2.addWeighted(img,alpha,blank,1-alpha,beta)#图像混合加权 return dst img4 = Contrast_and_Brightness(1.1,30,img3) cv2.imshow("Contrast", img4) #创建一个窗口 plt.figure('对比图',figsize=(7,5)) # 中文字体设置 font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14) #新宋体 #显示原图 plt.subplot(121) #子图1 #显示原图,设置标题和字体 plt.imshow(im,plt.cm.gray), plt.title('处理前图片', fontproperties = font) #显示处理过的图像 plt.subplot(122) #子图2 #显示处理后的图,设置标题和字体 plt.imshow(img4,plt.cm.gray), plt.title('处理后图片', fontproperties = font) plt.show() # 销毁所有窗口 cv2.destroyAllWindows()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。