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抓taobao图片爬虫
Oct 26 Python
python读取目录下最新的文件夹方法
Dec 24 Python
python3使用matplotlib绘制散点图
Mar 19 Python
python实现比较类的两个instance(对象)是否相等的方法分析
Jun 26 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
解决pycharm中导入自己写的.py函数出错问题
Feb 12 Python
Python实现验证码识别
Jun 15 Python
解决TensorFlow程序无限制占用GPU的方法
Jun 30 Python
面向新手解析python Beautiful Soup基本用法
Jul 11 Python
Jmeter HTTPS接口测试证书导入过程图解
Jul 22 Python
python爬虫中的url下载器用法详解
Nov 30 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 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中一个完整表单处理实现代码
2011/11/10 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
PHP提交表单失败后如何保留已经填写的信息
2014/06/20 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP使用mkdir创建多级目录的方法
2015/12/22 PHP
php session_decode函数用法讲解
2019/05/26 PHP
js通过googleAIP翻译PHP系统的语言配置的实现代码
2011/10/17 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
javascript用户注册提示效果的简单实例
2013/08/17 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
ionic进入多级目录后隐藏底部导航栏(tabs)的完美解决方案
2016/11/23 Javascript
浅谈vue,angular,react数据双向绑定原理分析
2017/11/28 Javascript
完美解决axios在ie下的兼容性问题
2018/03/05 Javascript
解决element-ui中下拉菜单子选项click事件不触发的问题
2018/08/22 Javascript
如何在JavaScript中谨慎使用代码注释
2019/06/21 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
JS实现百度搜索框
2021/02/25 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
python调用机器喇叭发出蜂鸣声(Beep)的方法
2015/03/23 Python
python 获取文件下所有文件或目录os.walk()的实例
2018/04/23 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
python如何实现数据的线性拟合
2019/07/19 Python
Python面向对象之继承原理与用法案例分析
2019/12/31 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
Java中各种基本数据类型的默认值都是什么
2016/12/22 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
家庭教育先进个人事迹材料
2014/01/24 职场文书
粗加工管理制度
2014/02/04 职场文书
我有一个梦想演讲稿
2014/05/05 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
公司出纳岗位职责
2015/03/31 职场文书
volatile保证可见性及重排序方法
2022/08/05 Java/Android