点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

我们已经练习了很多图像处理——操作图像(精确地说是图像矩阵)。为此,我们探索了图像的均衡方法,以便在一定程度上增强对比度,以使被处理的图像看起来比原始图像更好,这种技术称为直方图均衡化。

通常,发生的情况是在捕获图像时,它与自然视图并不相同。为了满足自然视图的水平,应进行后处理。因此,直方图均衡化(归一化)是通过调整图像的像素值来增强对比度的技术之一。

可以在下面看到一个示例:原始图像和均等图像。

如果我们要绘制图像直方图,它将看起来像下面的样子:

直方图均衡化的重要性

  1. 该方法对于亮和暗图像都效果更好,特别是在医学领域中,分析X射线图像的重要性更高。

  2. 在查看科学图像(例如热图像和卫星图像)时也非常有用。

执行步骤

在本文中,我们将通过使用openCV库以及使用justNumPy和从头开始实现此方法Matplotlib。尽管我们想不使用来做NumPy,但要花很多时间才能计算出来。

添加依赖库

import numpy as np
import cv2
import json
from matplotlib import pyplot as plt

读取图像

def read_this(image_file, gray_scale=False):image_src = cv2.imread(image_file)if gray_scale:image_src = cv2.cvtColor(image_src, cv2.COLOR_BGR2GRAY)else:image_src = cv2.cvtColor(image_src, cv2.COLOR_BGR2RGB)return image_src

上面的函数读取gray_scale或中的图像,RGB然后返回图像矩阵。

用库实现代码

为了均衡,我们可以简单地使用equalizeHist()库中可用的方法cv2。

1.读入图像时RGB。

  • 根据颜色组合分离像素。我们可以使用split()库中可用的方法cv2。

  • 对每个矩阵应用均衡方法。

  • 将均衡的图像矩阵与merge()库中可用的方法合并在一起cv2。

2.读入图像时gray_scale。

3.绘制原始图像和均衡图像。

def equalize_this(image_file, with_plot=False, gray_scale=False):image_src = read_this(image_file=image_file, gray_scale=gray_scale)if not gray_scale:r_image, g_image, b_image = cv2.split(image_src)r_image_eq = cv2.equalizeHist(r_image)g_image_eq = cv2.equalizeHist(g_image)b_image_eq = cv2.equalizeHist(b_image)image_eq = cv2.merge((r_image_eq, g_image_eq, b_image_eq))cmap_val = Noneelse:image_eq = cv2.equalizeHist(image_src)cmap_val = 'gray'if with_plot:fig = plt.figure(figsize=(10, 20))ax1 = fig.add_subplot(2, 2, 1)ax1.axis("off")ax1.title.set_text('Original')ax2 = fig.add_subplot(2, 2, 2)ax2.axis("off")ax2.title.set_text("Equalized")ax1.imshow(image_src, cmap=cmap_val)ax2.imshow(image_eq, cmap=cmap_val)return Truereturn image_eq

代码测试

equalize_this(image_file='lena_original.png', with_plot=True)

equalize_this(image_file = 'lena_original.png',with_plot = True,gray_scale = True)

实现代码

为此,我们正在使用NumPy所有矩阵运算。同样,我们可以使用for循环来执行此操作,但是它将花费更多的时间进行计算。即使在这里,我们也有两个方面:

1.读入图像时RGB。

  • 根据颜色组合分离像素。我们可以使用NumPy操作将其切细。

  • 对每个矩阵应用均衡方法。

  • 将均衡的图像矩阵与dstack(tup=())库中可用的方法合并在一起NumPy。

2.读入图像时gray_scale。

3.绘制原始图像和均衡图像。

让我们编写我们自己的函数来计算图像均衡,图像像素值通常在0到255之间。因此,总共有256个像素。

def enhance_contrast(image_matrix, bins=256):image_flattened = image_matrix.flatten()image_hist = np.zeros(bins)# frequency count of each pixelfor pix in image_matrix:image_hist[pix] += 1# cummulative sumcum_sum = np.cumsum(image_hist)norm = (cum_sum - cum_sum.min()) * 255# normalization of the pixel valuesn_ = cum_sum.max() - cum_sum.min()uniform_norm = norm / n_uniform_norm = uniform_norm.astype('int')# flat histogramimage_eq = uniform_norm[image_flattened]# reshaping the flattened matrix to its original shapeimage_eq = np.reshape(a=image_eq, newshape=image_matrix.shape)return image_eq

当将原始图像矩阵作为参数传递时,上述函数将返回一个均衡的图像矩阵。

让我们编写另一个函数,该函数为RGB图像和gray_scale使用上述功能的图像计算均衡。

def equalize_this(image_file, with_plot=False, gray_scale=False, bins=256):image_src = read_this(image_file=image_file, gray_scale=gray_scale)if not gray_scale:r_image = image_src[:, :, 0]g_image = image_src[:, :, 1]b_image = image_src[:, :, 2]r_image_eq = enhance_contrast(image_matrix=r_image)g_image_eq = enhance_contrast(image_matrix=g_image)b_image_eq = enhance_contrast(image_matrix=b_image)image_eq = np.dstack(tup=(r_image_eq, g_image_eq, b_image_eq))cmap_val = Noneelse:image_eq = enhance_contrast(image_matrix=image_src)cmap_val = 'gray'if with_plot:fig = plt.figure(figsize=(10, 20))ax1 = fig.add_subplot(2, 2, 1)ax1.axis("off")ax1.title.set_text('Original')ax2 = fig.add_subplot(2, 2, 2)ax2.axis("off")ax2.title.set_text("Equalized")ax1.imshow(image_src, cmap=cmap_val)ax2.imshow(image_eq, cmap=cmap_val)return Truereturn image_eq

代码测试

equalize_this(image_file='lena_original.png', with_plot=True)

equalize_this(image_file='lena_original.png', with_plot=True, gray_scale=True)

总结

  • 我们探索和实施不同的方法来增加图像强度,从而学到了很多东西。特别是,尝试通过引用和学习从头实现代码。

  • 使用库方法始终是一件好事,因为它们似乎更加优化并且可以100%工作。

  • 图像处理是一门非常重要的学科,确实值得尝试,要有很多好奇心和自己的探索。

— — 完 — — 

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

如何使用OpenCV实现图像均衡???相关推荐

  1. 如何使用 OpenCV 实现图像均衡?

    来源 | 小白视觉志 头图 | 下载于视觉中国 我们已经练习了很多图像处理--操作图像(精确地说是图像矩阵).为此,我们探索了图像的均衡方法,以便在一定程度上增强对比度,以使被处理的图像看起来比原始图 ...

  2. python去除图像光照不均匀_python+opencv——去除图像光照不均匀

    使用python版本的opencv去除图像中的光照不均匀 在图像处理中,如果图像中存在光照不均匀,则会影响图像处理的效果,比如在图像文本识别和图像分割中.本博客对于图像均衡化的处理主要参考文章:一种基 ...

  3. pythonopencv读取图像属性_2、OpenCV Python 图像属性获取

    __author__ = "WSX" import cv2 as cv import numpy as np image = cv.imread("1.JPG" ...

  4. Python,OpenCV骨架化图像并显示(skeletonize)

    Python,OpenCV骨架化图像并显示(skeletonize) 1. 效果图 2. 源码 参考: 1. 效果图 自己画一张图,原图 VS 骨架效果图如下: opencv logo原图 VS 骨架 ...

  5. 使用Python,OpenCV制作图像Mask——截取ROIs及构建透明的叠加层

    使用Python,OpenCV制作图像Mask--截取ROIs及构建透明的叠加层 1. 效果图 2. 源码 参考 这篇博客将介绍如何使用OpenCV制作Mask图像掩码.使用位运算和图像掩码允许我们只 ...

  6. 使用Python,OpenCV实现图像和实时视频流中的人脸模糊和马赛克

    使用Python,OpenCV实现图像和实时视频流中的人脸模糊和人脸马赛克 1. 效果图 2. 原理 2.1 什么是人脸模糊,如何将其用于人脸匿名化? 2.2 执行人脸模糊/匿名化的步骤 3. 源码 ...

  7. 使用Python和OpenCV检测图像中的条形码

    使用Python和OpenCV检测图像中的条形码 1. 效果图 2. 算法的步骤 3. 源码 参考 这篇博客将介绍使用计算机视觉和图像处理技术进行条形码检测的必要步骤,并演示使用Python编程语言和 ...

  8. 使用Python,OpenCV查找图像中的最亮点

    Python,OpenCV找出图像中的最亮点 1. 原理 2. 优化 3. 效果图 4. 源码 参考 这篇博客将向您展示如何使用Python和OpenCV查找图像中的最亮点,以及应用单行预处理代码-- ...

  9. 使用Python和OpenCV在图像之间执行超快速的颜色转换

    使用Python和OpenCV在图像之间执行超快速的颜色转换 1. 效果图 2. 原理 2.1 颜色转移算法 2.2 步骤 2.3 算法改进 3. 源码 参考 这篇博客将介绍如何使用Python和Op ...

最新文章

  1. 第十六周程序阅读(5)
  2. PHP的函数-----生成随机数、日期时间函数
  3. 「CEOI2019」魔法树(DP+差分启发式合并)
  4. [html] HTML为什么要语义化?语义化有什么好处?
  5. MySQL学习(3)单表查询
  6. 28 PP配置-生产车间控制-工序-定义报工屏幕默认值
  7. python3 字符串格式化_Python3-字符串格式化
  8. 修复版GEP宝塔内嵌版全解源码
  9. 助农两年销量千万 “李佳琦公益”实现“造血式”帮扶
  10. linux运维、架构之路-Kubernetes本地镜像仓库+dashboard部署
  11. Android之SwipeRefreshLayout下拉刷新组件
  12. Java集合对象详解
  13. MasterPage简介
  14. 计算机考研408真题2021年,2021年408考研科目真题及答案_文得学习网
  15. 从阿里云DATAV GeoAtlas接口抽取行政区划数据
  16. 用ZeroTier搭建属于自己的虚拟局域网(VLAN)
  17. Kaggle竞赛:Quora Insincere Questions Classification 总结与心得感想
  18. 掌握计算机基础知识的必要性,浅谈高校开展面向学科门类的计算机基础课程的必要性...
  19. 计算机筛选器无法搜索,大师为你win7系统搜索时提示“没有与搜索条件匹配的项”的操作方法...
  20. android安卓远程协助控制电脑PC端

热门文章

  1. AI时代,为何机器人公司无法盈利只能走向倒闭?
  2. 一键fxxk,代码修复神器拯救你
  3. 想去Google做AI?先看完这套面试指南(附面试题)
  4. AI一分钟 | 谷歌CEO承诺在中国组建更大团队;苹果与清华大学成立研究中心,并将帮助30万名贫困学生
  5. Hinton胶囊理论代码开源,上线即受热捧
  6. 迈吉客受邀参加《创意中国》, 85%超高支持率晋级年度盛典
  7. 3天学会TensorFlow | 香港科技大学
  8. 2021 年技术 5 大趋势
  9. 再见了,收费的Navicat。
  10. SQL 性能起飞了!