图像增强及运算篇之图像掩膜直方图和HS直方图

欢迎大家来到“Python从零到壹”,在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界。所有文章都将结合案例、代码和作者的经验讲解,真心想把自己近十年的编程经验分享给大家,希望对您有所帮助,文章中不足之处也请海涵。Python系列整体框架包括基础语法10篇、网络爬虫30篇、可视化分析10篇、机器学习20篇、大数据分析20篇、图像识别30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的关注、点赞和转发就是对秀璋最大的支持,知识无价人有情,希望我们都能在人生路上开心快乐、共同成长。

该系列文章主要讲解Python OpenCV图像处理和图像识别知识,前期主要讲解图像处理基础知识、OpenCV基础用法、常用图像绘制方法、图像几何变换等,中期讲解图像处理的各种运算,包括图像点运算、形态学处理、图像锐化、图像增强、图像平滑等,后期研究图像识别、图像分割、图像分类、图像特效处理以及图像处理相关应用。

第二部分将讲解图像运算和图像增强,上一篇文章介绍图像灰度直方图对比分析。这篇文章将继续讲解图像掩膜直方图和HS直方图,并分享一个通过直方图判断白天与黑夜的案例。希望文章对您有所帮助,如果有不足之处,还请海涵。

下载地址:记得点赞喔 O(∩_∩)O

前文赏析:

第一部分 基础语法

第二部分 网络爬虫

第三部分 数据分析和机器学习

第四部分 Python图像处理基础

第五部分 Python图像运算和图像增强

第六部分 Python图像识别和图像高阶案例

第七部分 NLP与文本挖掘

第八部分 人工智能入门知识

第九部分 网络攻防与AI安全

第十部分 知识图谱构建实战

扩展部分 人工智能高级案例

作者新开的“娜璋AI安全之家”将专注于Python和安全技术,主要分享Web渗透、系统安全、人工智能、大数据分析、图像识别、恶意代码检测、CVE复现、威胁情报分析等文章。虽然作者是一名技术小白,但会保证每一篇文章都会很用心地撰写,希望这些基础性文章对你有所帮助,在Python和安全路上与大家一起进步。


一.图像掩膜直方图

如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算。假设将要统计的部分设置为白色,其余部分设置为黑色,然后使用该掩膜进行直方图绘制,其完整代码如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#读取图像
img = cv2.imread(‘luo.png’)

#转换为RGB图像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#设置掩膜
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:300] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)

#图像直方图计算
hist_full = cv2.calcHist([img], [0], None, [256], [0,256]) #通道[0]-灰度图

#图像直方图计算(含掩膜)
hist_mask = cv2.calcHist([img], [0], mask, [256], [0,256])

plt.figure(figsize=(8, 6))

#设置字体
matplotlib.rcParams[‘font.sans-serif’]=[‘SimHei’]

#原始图像
plt.subplot(221)
plt.imshow(img_rgb, ‘gray’)
plt.axis(‘off’)
plt.title(“(a)原始图像”)

#绘制掩膜
plt.subplot(222)
plt.imshow(mask, ‘gray’)
plt.axis(‘off’)
plt.title(“(b)掩膜”)

#绘制掩膜设置后的图像
plt.subplot(223)
plt.imshow(masked_img, ‘gray’)
plt.axis(‘off’)
plt.title(“©图像掩膜处理”)

#绘制直方图
plt.subplot(224)
plt.plot(hist_full)
plt.plot(hist_mask)
plt.title(“(d)直方图曲线”)
plt.xlabel(“x”)
plt.ylabel(“y”)
plt.show()

其运行结果如图1所示,它使用了一个200×200像素的掩膜进行实验。其中图1(a)表示原始图像,图1(b)表示200×200像素的掩膜,图1©表示原始图像进行掩膜处理,图1(d)表示直方图曲线,蓝色曲线为原始图像的灰度值直方图分布情况,绿色波动更小的曲线为掩膜直方图曲线。

在这里插入图片描述


二.图像HS直方图

为了刻画图像中颜色的直观特性,常常需要分析图像的HSV空间下的直方图特性。HSV空间是由色调(Hue)、饱和度(Saturation)、以及亮度(Value)构成,因此在进行直方图计算时,需要先将源RGB图像转化为HSV颜色空间图像,然后将对应的H和S通道进行单元划分,再其二维空间上计算相对应直方图,再计算直方图空间上的最大值并归一化绘制相应的直方图信息,从而形成色调-饱和度直方图(或H-S直方图)。该直方图通常应用在目标检测、特征分析以及目标特征跟踪等场景[1-2]。

由于H和S分量与人感受颜色的方式是紧密相连,V分量与图像的彩色信息无关,这些特点使得HSV模型非常适合于借助人的视觉系统来感知彩色特性的图像处理算法。

下面的代码是具体的实现代码,使用matplotlib.pyplot库中的imshow()函数来绘制具有不同颜色映射的2D直方图。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#读取图像
img = cv2.imread(‘luo.png’)

#转换为RGB图像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#图像HSV转换
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

#计算H-S直方图
hist = cv2.calcHist(hsv, [0,1], None, [180,256], [0,180,0,256])

#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(121), plt.imshow(img_rgb, ‘gray’), plt.title(“(a)”), plt.axis(‘off’)

#绘制H-S直方图
plt.subplot(122), plt.imshow(hist, interpolation=‘nearest’), plt.title(“(b)”)
plt.xlabel(“x”), plt.ylabel(“y”)
plt.show()

图2(a)表示原始输入图像,图2(b)是原图像对应的彩色直方图,其中X轴表示饱和度(S),Y轴表示色调(H)。在直方图中,可以看到H=140和S=130附近的一些高值,它对应于艳丽的色调。

在这里插入图片描述


三.直方图判断白天黑夜

接着讲述一个应用直方图的案例,通过直方图来判断一幅图像是黑夜或白天。常见的方法是通过计算图像的灰度平均值、灰度中值或灰度标准差,再与自定义的阈值进行对比,从而判断是黑夜还是白天[3-4]。

  • 灰度平均值:该值等于图像中所有像素灰度值之和除以图像的像素个数。
  • 灰度中值:对图像中所有像素灰度值进行排序,然后获取所有像素最中间的值,即为灰度中值。
  • 灰度标准差:又常称均方差,是离均差平方的算术平均数的平方根。标准差能反映一个数据集的离散程度,是总体各单位标准值与其平均数离差平方的算术平均数的平方根。如果一幅图看起来灰蒙蒙的, 那灰度标准差就小;如果一幅图看起来很鲜艳,那对比度就很大,标准差也大。

下面的代码是计算灰度“Lena”图的灰度平均值、灰度中值和灰度标准差。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#函数: 获取图像的灰度平均值
def fun_mean(img, height, width):
sum_img = 0
for i in range(height):
for j in range(width):
sum_img = sum_img + int(img[i,j])
mean = sum_img / (height * width)
return mean

#函数: 获取中位数
def fun_median(data):
length = len(data)
data.sort()
if (length % 2)== 1:
z = length // 2
y = data[z]
else:
y = (int(data[length//2]) + int(data[length//2-1])) / 2
return y

#读取图像
img = cv2.imread(‘lena-hd.png’)

#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]

#计算图像的灰度平均值
mean = fun_mean(grayImage, height, width)
print(“灰度平均值:”, mean)

#计算图像的灰度中位数
value = grayImage.ravel() #获取所有像素值
median = fun_median(value)
print(“灰度中值:”, median)

#计算图像的灰度标准差
std = np.std(value, ddof = 1)
print(“灰度标准差”, std)

其运行结果如图3所示,图3(a)为原始图像,图3(b)为处理结果。其灰度平均值为123,灰度中值为129,灰度标准差为48.39。

在这里插入图片描述

下面讲解另一种用来判断图像是白天还是黑夜的方法,其基本步骤如下:

  • (1)读取原始图像,转换为灰度图,并获取图像的所有像素值;
  • (2)设置灰度阈值并计算该阈值以下的像素个数。比如像素的阈值设置为50,统计低于50的像素值个数;
  • (3)设置比例参数,对比该参数与低于该阈值的像素占比,如果低于参数则预测为白天,高于参数则预测为黑夜。比如该参数设置为0.8,像素的灰度值低于阈值50的个数占整幅图像所有像素个数的90%,则认为该图像偏暗,故预测为黑夜;否则预测为白天。

具体实现的代码如下所示。

# -*- coding: utf-8 -*-
# By:Eastmount
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#函数: 判断黑夜或白天
def func_judge(img):
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
piexs_sum = height * width
dark_sum = 0 #偏暗像素个数
dark_prop = 0 #偏暗像素所占比例

#读取图像
img = cv2.imread(‘day.png’)

#转换为RGB图像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#计算256灰度级的图像直方图
hist = cv2.calcHist([grayImage], [0], None, [256], [0,255])

#判断黑夜或白天
func_judge(grayImage)

#显示原始图像和绘制的直方图
plt.subplot(121), plt.imshow(img_rgb, ‘gray’), plt.axis(‘off’), plt.title(“(a)”)
plt.subplot(122), plt.plot(hist, color=‘r’), plt.xlabel(“x”), plt.ylabel(“y”), plt.title(“(b)”)

plt.show()

第一张测试图输出的结果如图4所示,其中图4(a)为原始图像,图4(b)为对应直方图曲线。

在这里插入图片描述

最终输出结果为“(‘This picture is bright!’, 0.010082704388303882)”,该预测为白天。

在这里插入图片描述

第二张测试图输出的结果如图6所示,其中图6(a)为原始图像,图6(b)为对应直方图曲线。

在这里插入图片描述

最终输出结果为“(‘This picture is dark!’, 0.8511824175824175)”,该预测为黑夜。

在这里插入图片描述


四.总结

本章主要讲解图像直方图相关知识点,包括掩膜直方图和HS直方图,并通过直方图判断黑夜与白天,通过案例分享直方图的实际应用。希望对您有所帮助,后续将进入图像增强相关知识点。

感谢在求学路上的同行者,不负遇见,勿忘初心。图像处理系列主要包括三部分,分别是:

在这里插入图片描述

在这里插入图片描述

请添加图片描述

(By:Eastmount 2022-08-16 夜于武汉 http://blog.csdn.net/eastmount/ )


参考文献:

  • [1]冈萨雷斯. 数字图像处理(第3版)[M]. 北京:电子工业出版社, 2013.
  • [2]张恒博, 欧宗瑛. 一种基于色彩和灰度直方图的图像检索方法[J]. 计算机工程, 2004.
  • [3]Eastmount. [数字图像处理] 四.MFC对话框绘制灰度直方图[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463.
  • [4]ZJE_ANDY. python3+opencv 利用灰度直方图来判断图片的亮暗情况[EB/OL]. (2018-06-20). https://blog.csdn.net/u014453898/article/details/80745987.
  • [5]阮秋琦. 数字图像处理学(第3版)[M]. 北京:电子工业出版社, 2008.
  • [6]Eastmount. [Python图像处理] 十一.灰度直方图概念及OpenCV绘制直方图[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多曝光图像融合是一种将不同曝光下的图像进行融合,以得到一幅细节丰富且亮度均衡的图像图像处理技术。在matlab中,可以使用多种算法来实现这一目标。 首先,可以使用简单平均法对多曝光图像进行融合。将不同曝光下的图像进行加权平均,权值可以根据曝光程度来分配。然后对结果进行亮度均衡,以保证图像的整体亮度一致。 此外,还可以使用拉普拉斯金字塔进行多曝光图像融合。首先,将所有曝光下的图像进行高斯金字塔分解,得到不同尺度的图像。然后,将不同尺度的图像进行拉普拉斯金字塔分解,获得低频和高频分量。接下来,对低频分量进行加权平均,再将高频分量进行融合。最后,通过逆变换将所有分量融合在一起,得到最终的多曝光融合图像。 此外,还可以使用自适应融合算法。该算法首先对输入图像进行曝光校正,以确保曝光一致。然后,通过计算不同曝光图像的权值,使用基于权重的融合方法进行融合。最后,对融合结果进行亮度均衡,以得到最终的多曝光融合图像。 总之,在matlab中,可以通过简单平均法、拉普拉斯金字塔以及自适应融合算法等多种方法来实现多曝光图像融合。这些方法可以根据具体需求和图像特性进行选择和调整,以获得满意的融合效果。 ### 回答2: 多曝光图像融合是指将多幅曝光不同的图像融合成一幅曝光均衡的图像。在Matlab中,我们可以使用以下方法实现多曝光图像融合。 首先,我们需要将多幅曝光不同的图像加载到Matlab中。可以使用imread函数读取图像文件,得到一个多维矩阵表示图像。 接下来,我们可以将每幅图像进行曝光补偿,以使得亮度相对均衡。可以使用imadjust函数对每幅图像进行增强处理,调整亮度范围。 然后,我们可以根据融合算法选择合适的策略来融合图像。常用的融合算法包括平均值融合、加权平均融合、拉普拉斯金字塔等。平均值融合可以简单地将多幅图像的像素值取平均,得到融合后的图像。加权平均融合可以根据每幅图像的曝光时间进行加权处理,以反映曝光时间对图像贡献的不同程度。拉普拉斯金字塔融合则采用金字塔结构将图像分解成多个层次,并通过融合操作将图像恢复。 最后,我们可以使用imshow函数将融合后的图像显示在Matlab界面上,或者使用imwrite函数将融合后的图像保存为文件。 总而言之,多曝光图像融合是一种将多幅曝光不同的图像融合为一幅曝光均衡的图像的方法。在Matlab中,我们可以通过加载图像、曝光补偿、选择融合算法以及显示或保存融合结果的步骤来实现多曝光图像融合。 ### 回答3: 多曝光图像融合是一种处理多个曝光不同的图像,将它们融合成一张高质量的图像的方法。在Matlab中,可以使用一些图像处理的工具和算法来实现多曝光图像融合。 首先,将不同曝光下拍摄的图像加载到Matlab中。可以使用`imread`函数来读取图像文件。然后,将每个图像进行预处理,例如进行灰度化、对比度增强或者直方图均衡化等操作,以便更好地融合图像。 接下来,选择一种融合算法。常见的多曝光图像融合算法有平均法、加权平均法、拉普拉斯金字塔等。可以使用Matlab中的图像处理函数来实现这些算法,例如`imadd`函数来进行加权平均或者`pyramidBlend`函数来进行拉普拉斯金字塔融合。 然后,对每个图像应用融合算法,生成融合后的图像。可以使用循环来依次处理每个图像,并将它们融合到最终的图像中。 最后,对生成的图像进行一些后处理,例如去噪、锐化等操作,以提高融合后图像的质量。可以使用Matlab中的滤波函数或者图像增强函数来实现这些操作。 多曝光图像融合在图像合成、HDR(高动态范围)图像生成等领域有着广泛的应用。在Matlab中,通过使用适当的图像处理工具和算法,我们可以轻松实现多曝光图像的融合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值