python中如何提高图像质量

 更新时间:2023年05月09日 10:03:06   作者:可乐大牛  
这篇文章主要介绍了python中如何提高图像质量问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

python提高图像质量

概述

调研了一些提高图像质量的方式

  • 深度学习方法,如微软的Bringing-Old-Photos-Back-to-Life的模型等。存在一些问题,首先是使用深度学习方法没有刚好的模型,得在自己的数据集上微调,比较麻烦,其次是带来的推理时间开销会比较大,不是特别划算,毕竟只是一个小环节。
  • 商用API,发现百度智能云提供了很多这方面的API,调用相当方便,但是免费次数有限啊。
  • 基于python自带的PIL 实现图片亮度增强、饱和度增强、对比度增强以及锐度增强。
  • 基于opencv实现数字图像处理!!!

百度智能云

官方教程:链接

参考代码(方便的一塌糊涂):

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)
    """ 调用图像清晰度增强 """
    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实现

from PIL import Image
from PIL import ImageEnhance
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['FangSong'] # 设置字体以便正确显示汉字
plt.rcParams['axes.unicode_minus'] = False # 正确显示连字符
# 原图
image = Image.open('img/timg.jpg')
# 亮度增强
enh_bri = ImageEnhance.Brightness(image)
brightness = 2
image_brightened = enh_bri.enhance(brightness)
# 色度增强(饱和度↑)
enh_col = ImageEnhance.Color(image)
color = 2
image_colored = enh_col.enhance(color)
# 对比度增强
enh_con = ImageEnhance.Contrast(image)
contrast = 2
image_contrasted = enh_con.enhance(contrast)
# 锐度增强
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("亮度增强")
axes[0,2].imshow(np.array(image_colored, dtype=np.uint8)[:,:,::-1])
axes[0,2].set_title("饱和度增强")
axes[1,0].imshow(np.array(image_contrasted, dtype=np.uint8)[:,:,::-1])
axes[1,0].set_title("对比度增强")
axes[1,1].imshow(np.array(image_sharped, dtype=np.uint8)[:,:,::-1])
axes[1,1].set_title("锐度增强")
axes[1,2].imshow(np.array(image_sharped, dtype=np.uint8)[:,:,::-1])
axes[1,2].set_title("锐度增强")
plt.show()

opencv实现

链接

python实现图像质量评价准则PSNR

计算PSNR的Python代码,网上有下面两种:

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

理论上,这两种计算方式都对应上面的计算公式,在输入图像一样的情况下,这两段代码的结果应该是一样的。

但是,在调用这段代码的时候,我发现这两者的结果却相差很远,同样的图片,psnr1的结果大概是29,而psnr2的结果是12。

gt = cv2.imread('1.jpg')
img= cv2.imread('2.jpg')
print(psnr1(gt,img))
print(psnr2(gt,img))

单看代码的话完全看不出来任何问题,后来我输出了这两张图像作差的结果,发现所有的值都是在0-255之间的,比如img1的一个像素值是30,img2的一个像素值是60,二者作差,本来应该是-30,但是结果却是226,即对于负值,输出要加上256。

所以,问题就出在这行代码上:

mse = np.mean((img1 - img2) ** 2 )

如果img1某个点的像素比img2小,而两者差别又比较大,这个绝对值比较大的负值就会变成一个比较小的正值,MSE的结果也会偏小,那么PSNR的值就会偏大。

只要把上面那行代码改成mse = np.mean((img1/1.0 - img2/1.0) ** 2 )就可以了。

最后,我们发现这两个结果是一样的了。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 通过实例了解Python str()和repr()的区别

    通过实例了解Python str()和repr()的区别

    这篇文章主要介绍了通过实例了解Python str()和repr()的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Python-接口开发入门解析

    Python-接口开发入门解析

    这篇文章主要介绍了Python-接口开发入门解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • python实现桌面壁纸切换功能

    python实现桌面壁纸切换功能

    这篇文章主要为大家详细介绍了python requests+pywin32实现桌面壁纸切换,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • 利用python 读写csv文件

    利用python 读写csv文件

    python中有一个读写csv文件的包,直接import csv即可。利用这个python包可以很方便对csv文件进行操作。
    2020-09-09
  • 浅谈Python3中datetime不同时区转换介绍与踩坑

    浅谈Python3中datetime不同时区转换介绍与踩坑

    最近的项目需要根据用户所属时区制定一些特定策略,学习、应用了若干python3的时区转换相关知识,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Python绘制二维曲线的日常应用详解

    Python绘制二维曲线的日常应用详解

    今天小编就为大家分享一篇Python绘制二维曲线的日常应用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-12-12
  • 基于OpenCV4.2实现单目标跟踪

    基于OpenCV4.2实现单目标跟踪

    这篇文章主要介绍了如何和何时使用OpenCV 4.2中可用的8种不同的跟踪器- BOOSTING, MIL, KCF, TLD, MEDIANFLOW, GOTURN, MOSSE和CSRT,并用他们实现单目标跟踪,需要的可以参考一下
    2022-03-03
  • 详解Python各大聊天系统的屏蔽脏话功能原理

    详解Python各大聊天系统的屏蔽脏话功能原理

    这篇文章主要介绍了详解Python各大聊天系统的屏蔽脏话功能原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。
    2016-12-12
  • python Yaml、Json、Dict之间的转化

    python Yaml、Json、Dict之间的转化

    这篇文章主要介绍了python Yaml 、Json 、Dict 之间的转化的示例,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-10-10
  • 详解如何使用Plotly和Dash进行数据可视化

    详解如何使用Plotly和Dash进行数据可视化

    数据可视化是数据分析中至关重要的一环,它能够帮助我们更直观地理解数据并发现隐藏的模式和趋势,本文将介绍如何使用Plotly和Dash进行数据可视化,感兴趣的可以了解下
    2024-04-04

最新评论