python中如何提高圖像質(zhì)量
python提高圖像質(zhì)量
概述
調(diào)研了一些提高圖像質(zhì)量的方式
- 深度學(xué)習(xí)方法,如微軟的Bringing-Old-Photos-Back-to-Life的模型等。存在一些問(wèn)題,首先是使用深度學(xué)習(xí)方法沒(méi)有剛好的模型,得在自己的數(shù)據(jù)集上微調(diào),比較麻煩,其次是帶來(lái)的推理時(shí)間開(kāi)銷(xiāo)會(huì)比較大,不是特別劃算,畢竟只是一個(gè)小環(huán)節(jié)。
- 商用API,發(fā)現(xiàn)百度智能云提供了很多這方面的API,調(diào)用相當(dāng)方便,但是免費(fèi)次數(shù)有限啊。
- 基于python自帶的PIL 實(shí)現(xiàn)圖片亮度增強(qiáng)、飽和度增強(qiáng)、對(duì)比度增強(qiáng)以及銳度增強(qiáng)。
- 基于opencv實(shí)現(xiàn)數(shù)字圖像處理?。?!
百度智能云
官方教程:鏈接
參考代碼(方便的一塌糊涂):
from aip import AipImageProcess
import base64
import os
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
client = AipImageProcess(APP_ID, API_KEY, SECRET_KEY)
""" 讀取圖片 """
def get_file_content(filePath):
with open(filePath, 'rb') as fp:
return fp.read()
def get_all_file(path):
all_file=[]
for i in os.listdir(path):
file_name=os.path.join(path,i)
all_file.append(file_name)
return all_file
for img_path in get_all_file('img'):
image = get_file_content(img_path)
""" 調(diào)用圖像清晰度增強(qiáng) """
if not os.path.exists('output'):
os.mkdir('output')
response = client.imageDefinitionEnhance(image)
imgdata = base64.b64decode(response['image'])
file = open(os.path.join('output', img_path.split('\\')[-1]), 'wb')
file.write(imgdata)
file.close()PIL實(shí)現(xiàn)
from PIL import Image
from PIL import ImageEnhance
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['FangSong'] # 設(shè)置字體以便正確顯示漢字
plt.rcParams['axes.unicode_minus'] = False # 正確顯示連字符
# 原圖
image = Image.open('img/timg.jpg')
# 亮度增強(qiáng)
enh_bri = ImageEnhance.Brightness(image)
brightness = 2
image_brightened = enh_bri.enhance(brightness)
# 色度增強(qiáng)(飽和度↑)
enh_col = ImageEnhance.Color(image)
color = 2
image_colored = enh_col.enhance(color)
# 對(duì)比度增強(qiáng)
enh_con = ImageEnhance.Contrast(image)
contrast = 2
image_contrasted = enh_con.enhance(contrast)
# 銳度增強(qiáng)
enh_sha = ImageEnhance.Sharpness(image)
sharpness = 4.0
image_sharped = enh_sha.enhance(sharpness)
fig,axes=plt.subplots(nrows=2,ncols=3,figsize=(10,8),dpi=100)
axes[0,0].imshow(np.array(image, dtype=np.uint8)[:,:,::-1])
axes[0,0].set_title("原圖")
axes[0,1].imshow(np.array(image_brightened, dtype=np.uint8)[:,:,::-1])
axes[0,1].set_title("亮度增強(qiáng)")
axes[0,2].imshow(np.array(image_colored, dtype=np.uint8)[:,:,::-1])
axes[0,2].set_title("飽和度增強(qiáng)")
axes[1,0].imshow(np.array(image_contrasted, dtype=np.uint8)[:,:,::-1])
axes[1,0].set_title("對(duì)比度增強(qiáng)")
axes[1,1].imshow(np.array(image_sharped, dtype=np.uint8)[:,:,::-1])
axes[1,1].set_title("銳度增強(qiáng)")
axes[1,2].imshow(np.array(image_sharped, dtype=np.uint8)[:,:,::-1])
axes[1,2].set_title("銳度增強(qiáng)")
plt.show()
opencv實(shí)現(xiàn)
python實(shí)現(xiàn)圖像質(zhì)量評(píng)價(jià)準(zhǔn)則PSNR
計(jì)算PSNR的Python代碼,網(wǎng)上有下面兩種:
import cv2 import numpy as np import math def psnr1(img1, img2): ? ?mse = np.mean((img1 - img2) ** 2 ) ? ?if mse < 1.0e-10: ? ? ? return 100 ? ?return 10 * math.log10(255.0**2/mse) def psnr2(img1, img2): ? ?mse = np.mean( (img1/255. - img2/255.) ** 2 ) ? ?if mse < 1.0e-10: ? ? ? return 100 ? ?PIXEL_MAX = 1 ? ?return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
理論上,這兩種計(jì)算方式都對(duì)應(yīng)上面的計(jì)算公式,在輸入圖像一樣的情況下,這兩段代碼的結(jié)果應(yīng)該是一樣的。
但是,在調(diào)用這段代碼的時(shí)候,我發(fā)現(xiàn)這兩者的結(jié)果卻相差很遠(yuǎn),同樣的圖片,psnr1的結(jié)果大概是29,而psnr2的結(jié)果是12。
gt = cv2.imread('1.jpg')
img= cv2.imread('2.jpg')
print(psnr1(gt,img))
print(psnr2(gt,img))單看代碼的話(huà)完全看不出來(lái)任何問(wèn)題,后來(lái)我輸出了這兩張圖像作差的結(jié)果,發(fā)現(xiàn)所有的值都是在0-255之間的,比如img1的一個(gè)像素值是30,img2的一個(gè)像素值是60,二者作差,本來(lái)應(yīng)該是-30,但是結(jié)果卻是226,即對(duì)于負(fù)值,輸出要加上256。
所以,問(wèn)題就出在這行代碼上:
mse = np.mean((img1 - img2) ** 2 )
如果img1某個(gè)點(diǎn)的像素比img2小,而兩者差別又比較大,這個(gè)絕對(duì)值比較大的負(fù)值就會(huì)變成一個(gè)比較小的正值,MSE的結(jié)果也會(huì)偏小,那么PSNR的值就會(huì)偏大。
只要把上面那行代碼改成mse = np.mean((img1/1.0 - img2/1.0) ** 2 )就可以了。
最后,我們發(fā)現(xiàn)這兩個(gè)結(jié)果是一樣的了。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
python smtplib模塊自動(dòng)收發(fā)郵件功能(一)
這篇文章主要為大家詳細(xì)介紹了python smtplib模塊自動(dòng)收發(fā)郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
pyspark自定義UDAF函數(shù)調(diào)用報(bào)錯(cuò)問(wèn)題解決
這篇文章主要為大家介紹了pyspark自定義UDAF函數(shù)調(diào)用報(bào)錯(cuò)問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python計(jì)算一個(gè)點(diǎn)到所有點(diǎn)的歐式距離實(shí)現(xiàn)方法
今天小編就為大家分享一篇Python計(jì)算一個(gè)點(diǎn)到所有點(diǎn)的歐式距離實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-07-07
詳解使用python crontab設(shè)置linux定時(shí)任務(wù)
本篇文章主要介紹了使用python crontab設(shè)置linux定時(shí)任務(wù),具有一定的參考價(jià)值,有需要的可以了解一下。2016-12-12
python實(shí)現(xiàn)的生成隨機(jī)迷宮算法核心代碼分享(含游戲完整代碼)
這篇文章主要介紹了python實(shí)現(xiàn)的隨機(jī)迷宮生成算法核心代碼分享,本文包含一個(gè)簡(jiǎn)單迷宮游戲完整代碼,需要的朋友可以參考下2014-07-07
基于Python實(shí)現(xiàn)從頭搭建一個(gè)在線(xiàn)聊天室框架
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)從頭搭建一個(gè)在線(xiàn)聊天室框架,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-11-11
Java ExcutorService優(yōu)雅關(guān)閉方式解析
這篇文章主要介紹了Java ExcutorService優(yōu)雅關(guān)閉方式解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05
使用Python腳本實(shí)現(xiàn)批量網(wǎng)站存活檢測(cè)遇到問(wèn)題及解決方法
本文是小編自己編寫(xiě)的一個(gè)使用python實(shí)現(xiàn)批量網(wǎng)站存活檢測(cè)。在項(xiàng)目測(cè)試中非常有用。本文給大家分享了遇到的問(wèn)題及解決方案,非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-10-10
Python實(shí)現(xiàn)合并兩個(gè)字典的8種方法
Python有多種方法可以通過(guò)使用各種函數(shù)和構(gòu)造函數(shù)來(lái)合并字典,本文主要介紹了Python實(shí)現(xiàn)合并兩個(gè)字典的8種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

