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

一.图像掩膜直方图

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

# -*- 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("(c)图像掩膜处理")
#绘制直方图
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 #偏暗像素所占比例
 for i in range(height):
 for j in range(width):
 if img[i, j] < 50: #阈值为50
 dark_sum += 1
 #计算比例
 print(dark_sum)
 print(piexs_sum)
 dark_prop = dark_sum * 1.0 / piexs_sum 
 if dark_prop >=0.8:
 print("This picture is dark!", dark_prop)
 else:
 print("This picture is bright!", dark_prop)
#读取图像
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直方图,并通过直方图判断黑夜与白天,通过案例分享直方图的实际应用。希望对您有所帮助,后续将进入图像增强相关知识点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/752834.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

风控图算法之中心性算法(小数据集Python版)

风控图算法之中心性算法&#xff08;小数据集Python版&#xff09; 图算法在金融风控领域的应用已经超越了传统的社区发现技术&#xff0c;这些技术曾被主要用于识别和分析欺诈性行为模式&#xff0c;例如黑产团伙。当前&#xff0c;一系列图统计算法&#xff0c;包括介数中心…

Filter and Search

应用筛选器时&#xff0c;“视图”仅显示符合当前筛选条件的记录。您可以根据一列或多列筛选数据。如果针对多个列进行筛选&#xff0c;则网格会在列筛选器之间应用AND逻辑运算符。 GridControl-Grid View 大多数DevExpress数据感知组件&#xff08;数据网格、树列表、垂直网…

大模型时代:程序员如何升职加薪?

什么是AI大模型&#xff1f; AI大模型&#xff0c;又称大规模预训练模型&#xff0c;是指那些具有超大规模参数量和复杂结构的人工智能模型。这些模型通常包含数百万至数百亿个参数&#xff0c;通过深度学习技术&#xff0c;特别是 Transformer 等先进架构&#xff0c;在大规模…

没有兴趣爱好的我,怎么填报高考志愿选专业?

这是我从知乎看来的一个问题&#xff0c;也在知乎做了回复&#xff0c;顺便摘录下来做个记录。 原文是&#xff1a;以为考完了就走向人生巅峰了&#xff0c;谁知道会这么down。我爸这两天一直追着问我有什么理想&#xff0c;搞得我很难受。过去的十几年里&#xff0c;我对人生都…

基于Volov7的安全帽检测系统

1 项目介绍 1.1 摘要 随着工业化和城市化的迅猛推进&#xff0c;工作场所的安全管理愈发受到重视。安全帽作为保护工人头部安全的关键装备&#xff0c;其实时监测和检测的重要性不言而喻。本文提出并深入研究了基于YOLOv7算法的安全帽佩戴检测技术&#xff0c;该技术旨在实现…

首户完工!江门市特殊困难老年人家庭适老化改造资助项目初见成效

日前&#xff0c;江门市特殊困难老年人家庭适老化改造项目取得新进展。位于蓬江区杜阮镇的黄伯家&#xff0c;成为“慈善筑迹溢彩同行”江门市特殊困难老年人家庭适老化改造项目资助的首户完工受益户。 黄伯的家由两座旧平房构成&#xff0c;大门门槛处原步差较大&#xff0c;…

高效实现虚拟机(VMware)安装教程(附安装包)

目录 一.下载VMware Wworkstation Pro 二 安装&#xff1a; 注&#xff1a;若是安装完VMware&#xff0c;还想在上面安装Centos、Ubuntu&#xff0c;系统请转到基于VMware的linux操作系统安装&#xff08;附安装包&#xff09;-CSDN博客 一.下载VMware Wworkstation Pro 渠道…

什么是div移动指令?如何用vue自定义指令实现?

目录 一、Vue.js框架介绍二、vue自定义指令directive三、什么是div移动指令四、使用vue自定义指令directive写一个div移动指令 一、Vue.js框架介绍 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它设计得非常灵活&#xff0c;可以轻松地被集成到现有的项目中&#xf…

有什么简单易上手的CRM系统推荐?五款CRM软件评测

在数字化时代&#xff0c;企业急需一个能全面展示客户、销售和分析数据的CRM系统。当然&#xff0c;简单易用的CRM系统成了企业首选。选择系统时&#xff0c;同时要关注它的实际功能是否满足需求&#xff0c;是否容易上手&#xff0c;能否根据企业需求灵活定制&#xff0c;能否…

生成式AI教育产品:深度解析教育各环节的智能化教学

随着人工智能技术的飞速发展&#xff0c;教育行业迎来了一场革命性的变革。 2024年&#xff0c;AI教育产品不仅在课堂上大放异彩&#xff0c;更在课前备课、课后辅导、教研支持等各个环节发挥着重要作用。 本文将为您全面总结AI教育产品如何渗透教育的每一个环节&#xff0c;并…

同步时钟:北斗/GPS卫星、电信基站、NTP以太网校时方式的区别

同步时钟是保证各设备时间统一的重要装置&#xff0c;广泛应用于电力、通信、金融、学校、医院、地铁等多个领域。目前&#xff0c;常用的同步时钟方式包括&#xff1a;北斗/GPS卫星、电信基站、NTP以太网等。 下面跟着小编来看一下这些校时方式及他们的区别吧。 1. 北斗/GP…

[漏洞复现] MetInfo5.0.4文件包含漏洞

[漏洞复现] MetInfo5.0.4文件包含漏洞 MetInfo5.0.4 漏洞代码审计 漏洞出现在about/index.php中&#xff0c;因为利用了动态地址&#xff0c;所以存在漏洞。 漏洞检查语句&#xff08;&#xff01;192.168.109.100是我的服务器ip&#xff0c;需要换成自己的&#xff09;&…

INDEMIND:智效赋能,让服务机器人服务于人

商用清洁机器人的价值战。 随着行业发展势头回归冷静&#xff0c;“卖家秀”时代成为过去&#xff0c;机器人拼技术、拼产品的价值战时代已然到来。 庞大的前景是香饽饽也是镜中花 作为被业内寄予厚望的服务机器人之一&#xff0c;背后的信心是来自于明确的需求和庞大的市场…

美区TikTok 2个选品思路分享,快速找准高潜爆品

传统选品思路&#xff0c;一般需要在商品的成长期和爆发期才能锁定商机。 但互联网电商生意上一切都讲究“快”&#xff0c;商品生周期从萌芽到衰退非常快&#xff0c;按照传统思路选品&#xff0c;能吃到的红利期很短。做TikTok生意&#xff0c;若想打破常规速度&#xff0c;喝…

关于IDEA启动报错 【JAVA_HOME does not point to a valid JM installation】

希望文章能给到你启发和灵感&#xff5e; 感谢支持和关注&#xff5e; 阅读指南 一、基础环境说明1.1 硬件环境1.2 软件环境 二、起因 一、基础环境说明 考虑环境因素不同&#xff0c;大家适当的对比自己的软硬件环境情况分析&#xff5e; 1.1 硬件环境 MacOS Monterey 版本 1…

绿盟又行了,漏管市场占有率第一

漏洞管理平台 吉祥学安全知识星球&#x1f517;除了包含技术干货&#xff1a;Java代码审计、web安全、应急响应等&#xff0c;还包含了安全中常见的售前护网案例、售前方案、ppt等&#xff0c;同时也有面向学生的网络安全面试、护网面试等。 今天看到不少朋友圈在转发&#xff…

生成随机函数f3,利用f3生成f18(python)

一、题目 给定一个完全随机函数f3。能够完全随机产生1~3之间任意一个自然数。现在要构造一个f18&#xff0c;让其能随机产生1~18之间任意一个自然数&#xff0c;要求写出f18的函数&#xff0c;另外要测试是否符合预期&#xff0c;f18要用f3 二、代码 欢迎大家给我更优解&…

AI产品经理需要懂的算法和模型

本篇希望以精准推荐模型为案例通过全面的撰写将AI产品经理需要懂的算法和模型进行了系统的入门讲解。 一个产品经理经常疑惑的概念&#xff1a; 算法和模型的关系&#xff0c;产品经理懂得解决问题时将问题抽象为模型&#xff0c;对模型求解用算法&#xff0c;没有谁大谁小&a…

移动端 UI 风格,书写华丽篇章

移动端 UI 风格&#xff0c;书写华丽篇章

点心甜品商城小程序店铺是怎样开展的

很多人非常喜欢甜品点心&#xff0c;包括在宴会、送礼、家庭聚会等场景也有应用度&#xff0c;该赛道也存在头部品牌&#xff0c;其余则是以地区为主的线下店&#xff0c;线上则主要以外卖及电商快递等方式经营。 除了线下店和其它平台进驻外&#xff0c;商家还需要多渠道获客…