python 图像增强算法实现详解


Posted in Python onJanuary 24, 2021

使用python编写了共六种图像增强算法:

1)基于直方图均衡化
2)基于拉普拉斯算子
3)基于对数变换
4)基于伽马变换
5)限制对比度自适应直方图均衡化:CLAHE
6)retinex-SSR
7)retinex-MSR其中,6和7属于同一种下的变化。
将每种方法编写成一个函数,封装,可以直接在主函数中调用。
采用同一幅图进行效果对比。

图像增强的效果为:

直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节
拉普拉斯算子可以增强局部的图像对比度
log对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好
伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于相机过曝)情况下的图像增强效果明显
CLAHE和retinex的效果均较好

python代码为:

# 图像增强算法,图像锐化算法
# 1)基于直方图均衡化 2)基于拉普拉斯算子 3)基于对数变换 4)基于伽马变换 5)CLAHE 6)retinex-SSR 7)retinex-MSR
# 其中,基于拉普拉斯算子的图像增强为利用空域卷积运算实现滤波
# 基于同一图像对比增强效果
# 直方图均衡化:对比度较低的图像适合使用直方图均衡化方法来增强图像细节
# 拉普拉斯算子可以增强局部的图像对比度
# log对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好
# 伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于相机过曝)情况下的图像增强效果明显

import cv2
import numpy as np
import matplotlib.pyplot as plt


# 直方图均衡增强
def hist(image):
  r, g, b = cv2.split(image)
  r1 = cv2.equalizeHist(r)
  g1 = cv2.equalizeHist(g)
  b1 = cv2.equalizeHist(b)
  image_equal_clo = cv2.merge([r1, g1, b1])
  return image_equal_clo


# 拉普拉斯算子
def laplacian(image):
  kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
  image_lap = cv2.filter2D(image, cv2.CV_8UC3, kernel)
  return image_lap


# 对数变换
def log(image):
  image_log = np.uint8(np.log(np.array(image) + 1))
  cv2.normalize(image_log, image_log, 0, 255, cv2.NORM_MINMAX)
  # 转换成8bit图像显示
  cv2.convertScaleAbs(image_log, image_log)
  return image_log


# 伽马变换
def gamma(image):
  fgamma = 2
  image_gamma = np.uint8(np.power((np.array(image) / 255.0), fgamma) * 255.0)
  cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
  cv2.convertScaleAbs(image_gamma, image_gamma)
  return image_gamma


# 限制对比度自适应直方图均衡化CLAHE
def clahe(image):
  b, g, r = cv2.split(image)
  clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
  b = clahe.apply(b)
  g = clahe.apply(g)
  r = clahe.apply(r)
  image_clahe = cv2.merge([b, g, r])
  return image_clahe


def replaceZeroes(data):
  min_nonzero = min(data[np.nonzero(data)])
  data[data == 0] = min_nonzero
  return data


# retinex SSR
def SSR(src_img, size):
  L_blur = cv2.GaussianBlur(src_img, (size, size), 0)
  img = replaceZeroes(src_img)
  L_blur = replaceZeroes(L_blur)

  dst_Img = cv2.log(img/255.0)
  dst_Lblur = cv2.log(L_blur/255.0)
  dst_IxL = cv2.multiply(dst_Img, dst_Lblur)
  log_R = cv2.subtract(dst_Img, dst_IxL)

  dst_R = cv2.normalize(log_R,None, 0, 255, cv2.NORM_MINMAX)
  log_uint8 = cv2.convertScaleAbs(dst_R)
  return log_uint8


def SSR_image(image):
  size = 3
  b_gray, g_gray, r_gray = cv2.split(image)
  b_gray = SSR(b_gray, size)
  g_gray = SSR(g_gray, size)
  r_gray = SSR(r_gray, size)
  result = cv2.merge([b_gray, g_gray, r_gray])
  return result


# retinex MMR
def MSR(img, scales):
  weight = 1 / 3.0
  scales_size = len(scales)
  h, w = img.shape[:2]
  log_R = np.zeros((h, w), dtype=np.float32)

  for i in range(scales_size):
    img = replaceZeroes(img)
    L_blur = cv2.GaussianBlur(img, (scales[i], scales[i]), 0)
    L_blur = replaceZeroes(L_blur)
    dst_Img = cv2.log(img/255.0)
    dst_Lblur = cv2.log(L_blur/255.0)
    dst_Ixl = cv2.multiply(dst_Img, dst_Lblur)
    log_R += weight * cv2.subtract(dst_Img, dst_Ixl)

  dst_R = cv2.normalize(log_R,None, 0, 255, cv2.NORM_MINMAX)
  log_uint8 = cv2.convertScaleAbs(dst_R)
  return log_uint8


def MSR_image(image):
  scales = [15, 101, 301] # [3,5,9]
  b_gray, g_gray, r_gray = cv2.split(image)
  b_gray = MSR(b_gray, scales)
  g_gray = MSR(g_gray, scales)
  r_gray = MSR(r_gray, scales)
  result = cv2.merge([b_gray, g_gray, r_gray])
  return result


if __name__ == "__main__":
  image = cv2.imread("example.jpg")
  image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

  plt.subplot(4, 2, 1)
  plt.imshow(image)
  plt.axis('off')
  plt.title('Offical')

  # 直方图均衡增强
  image_equal_clo = hist(image)

  plt.subplot(4, 2, 2)
  plt.imshow(image_equal_clo)
  plt.axis('off')
  plt.title('equal_enhance')

  # 拉普拉斯算法增强
  image_lap = laplacian(image)

  plt.subplot(4, 2, 3)
  plt.imshow(image_lap)
  plt.axis('off')
  plt.title('laplacian_enhance')

  # LoG对象算法增强
  image_log = log(image)

  plt.subplot(4, 2, 4)
  plt.imshow(image_log)
  plt.axis('off')
  plt.title('log_enhance')

  # 伽马变换
  image_gamma = gamma(image)

  plt.subplot(4, 2, 5)
  plt.imshow(image_gamma)
  plt.axis('off')
  plt.title('gamma_enhance')

  # CLAHE
  image_clahe = clahe(image)

  plt.subplot(4, 2, 6)
  plt.imshow(image_clahe)
  plt.axis('off')
  plt.title('CLAHE')

  # retinex_ssr
  image_ssr = SSR_image(image)

  plt.subplot(4, 2, 7)
  plt.imshow(image_ssr)
  plt.axis('off')
  plt.title('SSR')

  # retinex_msr
  image_msr = MSR_image(image)

  plt.subplot(4, 2, 8)
  plt.imshow(image_msr)
  plt.axis('off')
  plt.title('MSR')

  plt.show()

增强效果如下图所示:

python 图像增强算法实现详解

到此这篇关于python 图像增强算法实现详解的文章就介绍到这了,更多相关python 图像增强算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python从sqlite读取并显示数据的方法
May 08 Python
分享Python文本生成二维码实例
Jan 06 Python
python3新特性函数注释Function Annotations用法分析
Jul 28 Python
Python中取整的几种方法小结
Jan 06 Python
python unittest实现api自动化测试
Apr 04 Python
Python3.6连接Oracle数据库的方法详解
May 18 Python
浅析python中numpy包中的argsort函数的使用
Aug 30 Python
Python函数any()和all()的用法及区别介绍
Sep 14 Python
Python 字符串、列表、元组的截取与切片操作示例
Sep 17 Python
python enumerate内置函数用法总结
Jan 07 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
python自动生成证件号的方法示例
Jan 14 Python
详解用 python-docx 创建浮动图片
Jan 24 #Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 #Python
Python爬虫入门教程01之爬取豆瓣Top电影
Jan 24 #Python
详解python的变量缓存机制
Jan 24 #Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
Jan 23 #Python
利用Python函数实现一个万历表完整示例
Jan 23 #Python
python将YUV420P文件转PNG图片格式的两种方法
Jan 22 #Python
You might like
融入意大利的咖啡文化
2021/03/03 咖啡文化
PHP提取字符串中的图片地址[正则表达式]
2011/11/12 PHP
PHP的异常处理类Exception的使用及说明
2012/06/13 PHP
php解决和避免form表单重复提交的几种方法
2016/08/31 PHP
php设计模式之迭代器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
URL编码转换,escape() encodeURI() encodeURIComponent()
2006/12/27 Javascript
避免 showModalDialog 弹出新窗体的原因分析
2010/05/31 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
Vue项目中跨域问题解决方案
2018/06/05 Javascript
JSON数据中存在单个转义字符“\”的处理方法
2018/07/11 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
2019/12/20 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
[02:48]DOTA2英雄基础教程 拉席克
2013/12/12 DOTA
[02:47]DOTA2英雄基础教程 野性怒吼兽王
2013/12/05 DOTA
[54:18]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第一场 1月22日
2021/03/11 DOTA
Python中模拟enum枚举类型的5种方法分享
2014/11/22 Python
一键搞定python连接mysql驱动有关问题(windows版本)
2016/04/23 Python
Python对象中__del__方法起作用的条件详解
2018/11/01 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python中break、continue 、exit() 、pass终止循环的区别详解
2019/07/08 Python
Python Dict找出value大于某值或key大于某值的所有项方式
2020/06/05 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
2020/08/04 Python
顶岗实习计划书
2014/01/10 职场文书
会议开场欢迎词
2014/01/15 职场文书
市政施工员自我鉴定
2014/01/15 职场文书
称象教学反思
2014/02/03 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
挂职学习心得体会
2014/09/09 职场文书
群众路线剖析材料
2014/09/30 职场文书
创业计划书之个人工作室
2019/08/22 职场文书
Anaconda安装pytorch和paddle的方法步骤
2022/04/03 Python