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实现查询IP地址所在地
Mar 29 Python
Python运算符重载用法实例分析
Jun 01 Python
Python栈类实例分析
Jun 15 Python
python字符串的常用操作方法小结
May 21 Python
详解python中的装饰器
Jul 10 Python
Python动态赋值的陷阱知识点总结
Mar 17 Python
pandas 数据索引与选取的实现方法
Jun 21 Python
python求最大值,不使用内置函数的实现方法
Jul 09 Python
详解python中的数据类型和控制流
Aug 08 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
从多个tfrecord文件中无限读取文件的例子
Feb 17 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 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
S900/ ETON E1-XM 收音机
2021/03/02 无线电
模仿OSO的论坛(二)
2006/10/09 PHP
PHP 安全检测代码片段(分享)
2013/07/05 PHP
php下拉选项的批量操作的实现代码
2013/10/14 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
2015/01/07 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
PHP架构及原理知识点详解
2019/12/22 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
jquery scrollTop方法根据滚动像素显示隐藏顶部导航条
2013/05/27 Javascript
JavaScript实现N皇后问题算法谜题解答
2014/12/29 Javascript
轻松学习jQuery插件EasyUI EasyUI创建树形菜单
2015/11/30 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
利用vueJs实现图片轮播实例代码
2017/06/03 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
微信小程序使用Promise简化回调
2018/02/06 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
vue实现防抖的实例代码
2021/01/11 Vue.js
Python中对列表排序实例
2015/01/04 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
Anaconda+Pycharm环境下的PyTorch配置方法
2020/03/13 Python
Django实现将一个字典传到前端显示出来
2020/04/03 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
德国传统玻璃制造商:Cristalica
2018/04/23 全球购物
本科生求职简历的自我评价
2013/10/21 职场文书
房地产开发计划书
2014/01/10 职场文书
学生会部长竞聘书
2014/03/31 职场文书
关于爱国的演讲稿
2014/05/07 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
如何签定毕业生就业协议书
2014/09/28 职场文书
忠犬八公的故事观后感
2015/06/05 职场文书
详解python的内存分配机制
2021/05/10 Python
python单向链表实例详解
2022/05/25 Python