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

重磅干货,第一时间送达

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

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

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

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

直方图均衡化的重要性
  1. 该方法对于亮和暗图像都效果更好,特别是在医学领域中,分析X射线图像的重要性更高。
  2. 在查看科学图像(例如热图像和卫星图像)时也非常有用。
执行步骤

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

添加依赖库

import numpy as npimport cv2import jsonfrom 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 = None else: 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 True return 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 pixel for pix in image_matrix: image_hist[pix] += 1
# cummulative sum cum_sum = np.cumsum(image_hist) norm = (cum_sum - cum_sum.min()) * 255 # normalization of the pixel values n_ = cum_sum.max() - cum_sum.min() uniform_norm = norm / n_ uniform_norm = uniform_norm.astype('int')
# flat histogram image_eq = uniform_norm[image_flattened] # reshaping the flattened matrix to its original shape image_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 = None else: 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 True return 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扩展模块中文版教程
(0)

相关推荐

  • OpenCV探索之路(十一):轮廓查找和多边形包围轮廓

    Canny一类的边缘检测算法可以根据像素之间的差异,检测出轮廓边界的像素,但它没有将轮廓作为一个整体.所以要将轮廓提起出来,就必须将这些边缘像素组装成轮廓. OpenCV中有一个很强大的函数,它可以从 ...

  • python数字图像处理(三)边缘检测常用算子

    在该文将介绍基本的几种应用于边缘检测的滤波器,首先我们读入saber用来做为示例的图像 #读入图像代码,在此之前应当引入必要的opencv matplotlib numpysaber = cv2.im ...

  • OpenCV实战(1)

    如果需要处理的原图及代码,请移步小编的GitHub地址 传送门:请点击我 如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 最近 ...

  • 【OpenCV读取标记点坐标】管道测速

    文章目录 一.项目简介 二.思考步骤 1. 图像二值化 2. 滤波去噪 3. Canny算法检测边缘 4. 查找轮廓并计算 5. 绘制轮廓并表示质心 三.测试结果 四.工程代码 一.项目简介 昨天一个 ...

  • 图像自适应二值化方法---迭代阈值法

    通过迭代方法选择阈值, 计算方法如下: (1)选择灰度图的平均值作为初始阈值T0 ; (2)计算小于等于T0的平均值T1, 和大于T0的平均值T2; (3)新的阈值为T = (T1 + T2)/ 2; ...

  • 基于Opencv的图像单应性转换实战

    重磅干货,第一时间送达 同形转换 我们所常见的都是以这样的方式来处理图像:检测斑点,分割感兴趣的对象等.我们如何将它们从一种形式转换为另一种形式来处理这些图像呢?通过单应矩阵快速转换图像可以实现这个需 ...

  • 使用OpenCV测量图像中物体之间的距离

    重磅干货,第一时间送达 本文转自:opencv学堂 本文来自光头哥哥的博客[Measuring distance between objects in an image with OpenCV],仅做 ...

  • 好玩的OpenCV:图像操作的基本知识(2)

    1.1随机生成像素 生成与test.jpg相同大小图片,但是像素是随机生成的. import numpy as np import cv2raw_image = cv2.imread('test图片路 ...

  • 基于OpenCV的图像翻转和镜像

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本期,我们将解释如何在Python中实现图像的镜像或翻转.大家只需 ...

  • 基于OpenCV的图像强度操作

    重磅干货,第一时间送达 01. 什么是图像强度操作 更改任何通道中的像素值 对图像的数学运算 亮度变化 对比度变化 伽玛操纵 直方图均衡 图像预处理中的滤波等增强 使用OpenCV加载图像 impor ...

  • 基于OpenCV的图像融合

    重磅干货,第一时间送达 本期我们将一起学习如何使用OpenCV的进行图像拼接. 01. 目录 python 入门 步骤1 -图像导入 步骤2-调整图像大小 步骤3-融合图像 步骤4-导出结果 02. ...

  • 基于OpenCV的图像阴影去除

    重磅干货,第一时间送达 我们经常需要通过扫描将纸上的全部内容转换为图像.有很多在线工具可以提高图像的亮度,或者消除图像中的阴影.但是我们可以手动删除阴影吗?当然可以,我们只需要将图像加载到相应的代码中 ...

  • 基于OpenCV的图像卡通化

    重磅干货,第一时间送达 本期将创建一个类似于Adobe Lightroom的Web应用程序,使用OpenCV和Streamlit实现图像的卡通化 作为一个狂热的街头摄影爱好者,几乎每个周末都要在城市中 ...

  • 使用OpenCV进行图像全景拼接

    重磅干货,第一时间送达 def detectAndDescribe(image, method=None): """ Compute key points and fea ...