首頁 > 軟體

Python實現影象增強

2022-08-05 14:02:03

本文範例為大家分享了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:windowsfontssimsun.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()

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com