前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用 OpenCV 实现图像均衡?

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

作者头像
AI科技大本营
发布2021-05-10 10:42:40
1.1K0
发布2021-05-10 10:42:40
举报

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

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

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

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

直方图均衡化的重要性

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

执行步骤

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

添加依赖库

代码语言:javascript
复制
import numpy as npimport cv2import jsonfrom matplotlib import pyplot as plt

读取图像

代码语言:javascript
复制
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.绘制原始图像和均衡图像。

代码语言:javascript
复制
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

代码测试

代码语言:javascript
复制
equalize_this(image_file='lena_original.png', with_plot=True)
代码语言:javascript
复制
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个像素。

代码语言:javascript
复制
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使用上述功能的图像计算均衡。

代码语言:javascript
复制
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

代码测试

代码语言:javascript
复制
equalize_this(image_file='lena_original.png', with_plot=True)
代码语言:javascript
复制
equalize_this(image_file='lena_original.png', with_plot=True, gray_scale=True)

总结

  • 我们探索和实施不同的方法来增加图像强度,从而学到了很多东西。特别是,尝试通过引用和学习从头实现代码。
  • 使用库方法始终是一件好事,因为它们更加优化并且可以100%工作。
  • 图像处理是一门非常重要的学科,确实值得尝试,要有很多好奇心和自己的探索。
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI科技大本营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档