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中的高级函数map/reduce使用实例
Apr 13 Python
用Python创建声明性迷你语言的教程
Apr 13 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
python使用Tkinter显示网络图片的方法
Apr 24 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
对python中list的拷贝与numpy的array的拷贝详解
Jan 29 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
Python内存管理实例分析
Jul 10 Python
解决Python中回文数和质数的问题
Nov 24 Python
Python3合并两个有序数组代码实例
Aug 11 Python
Python实现定时监测网站运行状态的示例代码
Sep 30 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 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
html中select语句读取mysql表中内容
2006/10/09 PHP
php5中类的学习
2008/03/28 PHP
php MYSQL 数据备份类
2009/06/19 PHP
Joomla下利用configuration.php存储简单数据
2010/05/19 PHP
PHP获取指定函数定义在哪个文件中以及其所在的行号实例
2014/05/08 PHP
PHP+Ajax异步带进度条上传文件实例
2016/11/01 PHP
PHP基于DOMDocument解析和生成xml的方法分析
2017/07/17 PHP
PHP设计模式之状态模式定义与用法详解
2018/04/02 PHP
JavaScript 嵌套函数指向this对象错误的解决方法
2010/03/15 Javascript
拖动table标题实现改变td的大小(css+js代码)
2013/04/16 Javascript
手机开发必备技巧:javascript及CSS功能代码分享
2015/05/25 Javascript
JavaScript实现广告的关闭与显示效果实例
2015/07/02 Javascript
Javascript基础_简单比较undefined和null 值
2016/06/14 Javascript
微信小程序 教程之小程序配置
2016/10/17 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
Chrome调试折腾记之JS断点调试技巧
2017/09/11 Javascript
基于ionic实现下拉刷新功能
2018/05/10 Javascript
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
vue2实现搜索结果中的搜索关键字高亮的代码
2018/08/29 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
js页面加载后执行的几种方式小结
2020/01/30 Javascript
Angular 多模块项目构建过程
2020/02/13 Javascript
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
用Python制作简单的钢琴程序的教程
2015/04/01 Python
Python实现的逻辑回归算法示例【附测试csv文件下载】
2018/12/28 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
python实时监控logstash日志代码
2020/04/27 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
自我鉴定怎么写
2013/12/05 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
爱情保证书大全
2014/04/29 职场文书
运动会班级口号
2014/06/09 职场文书
2014年光棍节活动策划方案(创意集锦)
2014/09/29 职场文书
怎样写家长意见
2015/06/04 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
2016大学生就业指导课心得体会
2016/01/15 职场文书