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利用正则表达式匹配并截取指定子串及去重的方法
Jul 30 Python
Python多进程同步简单实现代码
Apr 27 Python
python 性能提升的几种方法
Jul 15 Python
Python 实现链表实例代码
Apr 07 Python
tensorflow实现softma识别MNIST
Mar 12 Python
使用k8s部署Django项目的方法步骤
Jan 14 Python
Python遍历文件夹 处理json文件的方法
Jan 22 Python
详解使用python绘制混淆矩阵(confusion_matrix)
Jul 14 Python
Django基础知识 URL路由系统详解
Jul 18 Python
python自动结束mysql慢查询会话的实例代码
Oct 27 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
Python线程条件变量Condition原理解析
Jan 20 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
PHP+MySQL删除操作实例
2015/01/21 PHP
PHP扩展程序实现守护进程
2015/04/16 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
JavaScript 设计模式 富有表现力的Javascript(一)
2010/05/26 Javascript
js 代码优化点滴记录
2012/02/19 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
JS简单实现城市二级联动选择插件的方法
2015/08/19 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
JavaScript中自带的 reduce()方法使用示例详解
2016/08/10 Javascript
angularjs中使用ng-bind-html和ng-include的实例
2017/04/28 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
JS中实现浅拷贝和深拷贝的代码详解
2019/06/05 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
python3调用百度翻译API实现实时翻译
2018/08/16 Python
python基于socket进行端口转发实现后门隐藏的示例
2019/07/25 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
2020/03/08 Python
python调用有道智云API实现文件批量翻译
2020/10/10 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
html5定位获取当前位置并在百度地图上显示
2014/08/22 HTML / CSS
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
给排水专业应届生求职信
2013/10/12 职场文书
2014年国庆标语
2014/06/30 职场文书
六一儿童节活动总结
2014/08/27 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
2015年电信员工工作总结
2015/05/26 职场文书
网吧温馨提示
2015/07/17 职场文书
Python基础之进程详解
2021/05/21 Python
React 并发功能体验(前端的并发模式)
2021/07/01 Javascript