《深度学习》OpenCV 高阶 图像直方图、掩码图像 参数解析及案例实现

目录

一、图像直方图

1、什么是图像直方图

2、作用

1)分析图像的亮度分布

2)判断图像的对比度

3)检测图像的亮度和色彩偏移

4)图像增强和调整

5)阈值分割

3、举例

二、直方图用法

1、函数用法

2、参数解析

1)image

2)channel

3)mask

4)histSize

5)ranges

3、代码实现

运行结果:

三、mask掩码图像

1、什么是掩码图像

2、参数解析

1)用法

2)src1、src2

3)dst

4)mask

3、案例

运行结果:

四、直方图均衡化

1、什么是直方图均衡化

2、步骤

3、案例实现

运行结果:

4、自适应直方图均衡化

1)概念

2)步骤

3)代码展示

运行结果:


一、图像直方图

1、什么是图像直方图

        图像直方图是描述图像像素值分布情况的统计图形。它表示了图像中不同像素值的数量或频率

        在图像直方图中,横轴表示像素值的范围,通常为0-255纵轴表示像素值的数量或频率。直方图的每一个条柱代表某个像素值范围内像素的数量或频率。例如,柱子的高度表示图像中具有该像素值的像素的数量或出现的频率。

2、作用

        1)分析图像的亮度分布

                通过直方图可以了解图像中不同亮度值的像素数量,从而判断图像的亮度分布情况。例如,如果直方图中灰度级别集中在低亮度区域,说明图像较暗;如果直方图分布在高亮度区域,则说明图像较亮。

        2)判断图像的对比度

                直方图的宽度反映了图像的对比度。直方图宽度越大,表示图像中像素值分布越分散,对比度越高;相反,直方图宽度越窄,表示图像中像素值分布越集中,对比度越低。

        3)检测图像的亮度和色彩偏移

                通过比较不同颜色通道的直方图,可以判断图像是否存在亮度或色彩偏移。例如,如果红色通道的直方图偏向左侧,则说明图像偏向较暗的红色,存在亮度偏移。

        4)图像增强和调整

                通过分析直方图,可以根据图像的特点进行增强和调整。例如,可以通过直方图均衡化来增强图像的对比度;可以通过直方图匹配来调整图像的色彩和亮度分布。

        5)阈值分割

                直方图可以用于确定图像的阈值,用于分割图像中的目标物体和背景。通过直方图的谷底或者双峰可以确定一个适合的阈值值,将图像分成两个部分。

3、举例

灰度值在0 - 255范围之间总共 256 个值,可以将我们的范围划分为子部分(称为bins),例

二、直方图用法

1、函数用法

cv2.calcHist(images,channels,mask,histsize,ranges) 计算图像的直方图,用于表示图像中像素灰度级别的分布情况。

        cv2.calcHist()函数是OpenCV中的一种直方图计算方法,用于计算图像的直方图。它可以计算输入图像中每个通道的直方图,并将其存储在一个单独的数组中

2、参数解析

        1)image

                输入图像的列表。如果只有一幅图像,则传递一个包含该图像的列表。如果有多幅图像,则传递一个包含所有图像的列表。

        2)channel

                要计算直方图的通道索引。对于灰度图像,传递[0]表示计算灰度直方图。对于彩色图像,可以使用[0]表示蓝色通道的直方图,[1]表示绿色通道的直方图,[2]表示红色通道的直方图。

        3)mask

                可选参数,用于指定计算直方图的掩码图像。只有掩码图像中像素值为非零的像素才会被考虑在内。

        4)histSize

                直方图的大小。对于灰度图像,传递一个整数表示直方图的bin数目。对于彩色图像,传递一个包含每个通道的bin数目的列表。

        5)ranges

                直方图的范围。对于灰度图像,传递一个包含最小值和最大值的元组。对于彩色图像,传递一个包含每个通道的最小值和最大值的元组。

3、代码实现

import cv2
import matplotlib.pyplot as plt
import numpy as npphone = cv2.imread('phone.png',cv2.IMREAD_GRAYSCALE)    # 灰度图读取,将图像转换为一维数组
a = phone.ravel()   # 这里使用了 numpy 的 ravel 函数,将多维数组拉成一维数组。
# 绘制直方图
plt.hist(a,bins=256)  # 使用 matplotlib 的 hist 的数绘制直方图。
# -a:一维数组,即图像的像素值组成的数组。
# - bins=256:指定直方图的条数,即灰度级的数量。plt.show()  # 显示直方图
phone_hist = cv2.calcHist([phone],[0],None,[16],[0,256])  # 表示对图形phone绘制直方图,[0]表示为灰度图,none表示没有用掩码图像,直方图bins数目为16,范围是【0,256】
plt.plot(phone_hist)    # 使用calcHist的值绘制曲线图
plt.show()
img = cv2.imread('phone.png')   # 直接读取猜测图片
color = ('b','g','r')   # 定义通道颜色
for i,col in enumerate(color):   # enumerate对可迭代对象生成索引和数值histr = cv2.calcHist([img], [i],None, [256], [0, 256])plt.plot(histr,color=col)  # 表示绘制的图线颜色为三通道图像的折线  plt.show()
运行结果:

三、mask掩码图像

1、什么是掩码图像

        掩码图像(Mask Image)是一种与原图像具有相同尺寸二进制图像,其中像素值为0255或其他非零值)。掩码图像用于指示在应用某些图像处理操作时要处理的特定区域。在掩码图像中,像素值为0的位置表示不需要处理的区域,而像素值为255的位置表示需要处理的区域。

        通过将掩码图像原图像进行逐像素逻辑运算,可以实现对特定区域进行掩模(遮罩),只对感兴趣的区域进行处理,而不影响其他区域。掩码图像在图像分割、图像修复、图像特征提取等图像处理任务中很常见,它可以用来指定感兴趣的区域,从而在处理过程中对特定区域进行操作或分析。

2、参数解析

        1)用法
bitwise_and(src1,src2,dst=None, mask=None)

                对图像(灰度图像或彩色图像均可)每个像素值进行二进制"与"操作,1&1=1,1&0=0,0&1=0,O&G

        2)src1、src2

                输入图像或标量,标src1和src2相与。

        3)dst

                可选输出变量,如果需要使用非None则要先定义,且其大小与输入变量相同

        4)mask

                图像掩膜,可选参数,用于指定要更改的输出图像数组的元素,mask为0的值,src1和src2相与的值都为0

3、案例

import cv2
import numpy as np
import matplotlib.pyplot as plt
phone = cv2.imread('phone.png',cv2.IMREAD_GRAYSCALE)  # 读取灰度图
cv2.imshow('phone',phone)  # 展示原图的灰度图形式
cv2.waitKey(0)
mask = np.zeros(phone.shape[:2],np.uint8)  # 通过np生成一个全0矩阵,长短为原图的宽和高,值为0表示纯黑图像,用于制作mask蒙板
mask[50:350,100:470] = 255  # 切片,将数组中的宽度50-350与高度100-470这块面积内的值全部更改为255,表示纯白色
cv2.imshow('mask',mask)  # 使用OpenCV以图像形式展示数组内容
cv2.waitKey(0)phone_mask = cv2.bitwise_and(phone,phone,mask=mask)  # 使用掩码图像mask将原图与自身进行按位与操作,得到只有掩码区域保留原图像像素值的掩码图像phone_mask
cv2.imshow('phone_mask',phone_mask)
cv2.waitKey(0)
phone_hist_mask = cv2.calcHist([phone],[0],mask,[256],[0,256])  # 展示原图像带掩码图像的像素直方图
plt.plot(phone_hist_mask)
plt.show()
        运行结果:

四、直方图均衡化

1、什么是直方图均衡化

        直方图均衡化是一种图像增强的方法,通过重新分布图像的像素值,使得图像的整体对比度增强,细节得到更好的展示。

        在图像中,像素值的分布情况可以用直方图表示直方图均衡化目标是将图像的直方图变成一个均匀分布的直方图,从而使得图像中的像素值范围更广泛地利用,并增强图像的对比度。

2、步骤

        1)计算图像的累积直方图,即将每个灰度级别的像素值累加起来得到的直方图。
        2)根据累积直方图,将原图像中每个像素的灰度值映射为新的像素值,使得新的像素值均匀分布,可以使用以下公式计算新的像素值:

        new_pixel = (cumulative_hist[old_pixel]/total_pixels) * (num_bins-1)

        其中,cumulative_hist 是累积直方图,old_pixel 是原图像中的像素值,total_pixels 是原图像的总像素数,num_bins 是灰度级别的总数。
        3)根据映射后的像素值,得到均衡化后的图像。

3、案例实现

import cv2
import numpy as np
import matplotlib.pyplot as pltphone = cv2.imread('woman.png',cv2.IMREAD_GRAYSCALE)  # 读取彩色图片的灰度图
# phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(phone.ravel(),bins=256)  # 绘制直方图,numpy中的ravel将多维数组转变成一维数组,256表示将像素值范围划分为256个区间
plt.show()phone_equalize = cv2.equalizeHist(phone)
plt.hist(phone_equalize.ravel(),bins=256)  # numpy中的ravel将数组多维度拉成一维数组
plt.show()res = np.hstack((phone,phone_equalize))     # 横向拼接,将多个数组按水平方向(列顺序)堆叠成一个新的数组。
cv2.imshow('phone_equalize',res)
cv2.waitKey(0)
运行结果:

4、自适应直方图均衡化

        1)概念

                传统的直方图均衡化方法是将整个图像的直方图变成均匀分布,但在某些情况下,图像的局部区域可能存在过亮或过暗的问题。自适应直方图均衡化通过将图像分成多个小的局部区域,并对每个局部区域进行直方图均衡化,从而避免了全局均衡化带来的问题。

        2)步骤

                • 将图像分成多个不重叠的小块,每个小块称为一个局部区域。

                • 对每个局部区域进行直方图均衡化,得到均衡化后的局部区域。

                • 将均衡化后的局部区域重新拼合,得到最终的均衡化图像。

        

        3)代码展示

                (此处衔接上述代码)

clahe = cv2.createCLAHE(clipLimit=1,tileGridSize=(16,16))   # 通过类创建了一个均衡化对象
# clipLimit表示对比度的限制,tileGridSize表示图像均匀划分的小块大小
phone_clahe = clahe.apply(phone)  # 将均衡化对象应用到图片phone上得到均衡化处理后的图片phone_clahe
res = np.hstack((phone,phone_equalize,phone_clahe))  # 将原图、直方图均衡化后的图像、自适应直方图均衡化后的图像,水平方向合并
cv2.imshow("phone_equalize",res)
cv2.waitKey(0)

         运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++——深部解析哈希

好久不见给大家分享一张图片吧 目录 前言 二、库文件 1、哈希冲突 2 哈希函数 3、闭散列 三 、闭散列的实现和底层逻辑 1、哈希表(闭散列)的定义 2、哈希表(闭散列)的插入 3、哈希表(闭散列)的查找 4.哈希表…

【Unity踩坑】No cloud project ID was found by the Analytics SDK

在编译默认的URP 2D项目时,出现这样一个错误:No cloud project ID was found by the Analytics SDK. This means Analytics events will not be sent. Please make sure to link your cloud project in the Unity editor to fix this problem. 原因&…

JavaScript 基础 - 第16天_AJAX入门

文章目录 Day01_Ajax入门目录学习目标01.AJAX 概念和 axios 使用目标讲解小结 02.认识 URL目标讲解小结 03.URL 查询参数目标讲解小结 04.案例-查询-地区列表目标讲解小结 05.常用请求方法和数据提交目标讲解小结 06.axios 错误处理目标讲解小结 07.HTTP 协议-请求报文目标讲解…

【TabBar嵌套Navigation案例-cell重用 Objective-C语言】

一、我们来说这个cell重用(重复使用)的问题啊 1.我们这个比分直播推送页面, 这个里边呢,现在这个cell,涉及到两个样式,上面呢,是Default的,下面呢,是Value1的,然后,我们在这个里边啊,我们每一组就一个cell啊,然后呢,我把这个组,多给它复制几份儿,现在是三个组…

如何利用 CSS 渐变实现多样化背景效果

前言 总在平常看到像这样的图片 背景是如何实现的呢 背景效果的多样性和美观性直接影响用户体验。CSS 渐变为设计师提供了一种强大且灵活的方法来创建引人注目的背景。渐变是颜色之间平滑过渡的效果,通过调整渐变类型和设置,你可以轻松实现从简单到复杂…

灵雀云DevOps:加速应用交付,点燃业务创新引擎

导语 近日,国际知名咨询机构Gartner发布了2024年度DevOps平台魔力象限报告(Gartner Magic Quadrant for DevOps Platforms),为信息化决策者在技术战略层面提供了选型和评估DevOps平台供应商的全面视角。报告中,中国云…

UEC++学习(十七)利用SceneCaptureComponent2d进行截图

最近有个需求是需要将场景中的actor进行截图,并且将截图保存成png,png中需要将场景背景忽略掉,只显示特定的actor。 这里是通过SceneCapture2d组件捕捉场景后,将背景的alpha通道设置为0,实现背景透明的功能。 &#x…

计算机网络:概述 - 计算机网络概述

目录 一. 互联网概述 1.1 网络 1.2 互联网 1.3 因特网 二. 互联网发展的三个阶段 三. 互联网的标准化工作 四. 互联网的组成 五. 计算机网络的类别 5.1 计算机网络的定义 5.2 计算机网络的不同类别 一. 互联网概述 起源于美国的互联网现如今已…

力扣213-打家劫舍 II(Java详细题解)

题目链接:213. 打家劫舍 II - 力扣(LeetCode) 前情提要: 本体是打家劫舍的一个变形题,希望大家能先做198. 打家劫舍 - 力扣(LeetCode),并看一下我上题的讲解力扣198-打家劫舍&…

sheng的学习笔记-AI-规则学习(rule learning)

AI目录:sheng的学习笔记-AI目录-CSDN博客 什么是规则学习 机器学习中的“规则”(rule)通常是指语义明确、能描述数据分布所隐含的客观规律或领域概念、可写成“若……,则……”形式的逻辑规则。​“规则学习”(rule learning)是从训练数据中学习出一组能…

Lua发邮件:实现自动化邮件发送教程指南!

Lua发邮件高级技巧有哪些?如何利用Lua发送电子邮件? 自动化邮件发送是一个非常实用的功能,广泛应用于各种场景,如通知、提醒、报告生成等。Lua作为一种轻量级脚本语言,因其简洁和高效而受到广泛欢迎。AokSend将详细介…

OpenCV class2-C#+winfrom显示控件使用窗口大小并内存管理

一.控件效果说明 二.代码声明(已经循环读取10000次) 全局 OpenCvSharp.Point point new OpenCvSharp.Point(0, 0); OpenCvSharp.Size size2; Mat src new Mat(); 初始化 size2 new OpenCvSharp.Size(pictureBox1.Size.Width, pictureBox1.Size.Hei…

PHP智驭未来悦享生活智慧小区物业管理小程序系统源码

智驭未来,悦享生活 —— 探索智慧小区物业管理小程序 一、引言:智慧生活的新篇章 在这个日新月异的时代,科技正以前所未有的速度改变着我们的生活。从智能家居到智慧城市,每一处都闪耀着智慧的光芒。而今天,我要带大家…

elementui Cascader 级联选择器的使用总结

实现效果 技术要点总结如下: 1、点击添加自动增加多行,实现自主选择增加多条节点数据 2、节点地址使用的是Cascader 级联选择器,需要动态生成,涉及到一个技术要点是:因v-modal只能获取value不能获取label,故…

汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)

题目: 编写一段主引导扇区程序,计算从1加到1000的和,并在屏幕上显示结果 输出结果: 代码: jmp near start text db 123...1000 start:mov ax,0x07c0mov ds,ax ;数据段从主引导区开始mov ax,0xb800mov es,ax ;显存地址从B8000物理地址开始mov si,text ;si指向text的第…

极狐GitLab 新一代容器镜像仓库正式上线啦!

从极狐GitLab 17.3 开始,私有化部署实例也可以使用新一代容器镜像仓库啦!新一代容器镜像仓库具有更高效的零宕机垃圾收集功能和其他优势。 从去年开始,极狐GitLab 就启动了重构容器镜像仓库的计划,用以构建具有更强功能的镜像仓库…

什么是测试驱动开发?

测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,它强调在编写功能代码之前,先编写测试代码。这种方法的核心思想是通过测试来推动整个开发过程的进行,确保代码的质量和可维护性。 一、基…

Hibernate QueryPlanCache 查询计划缓存引发的内存溢出

目录 1.排查方式2.结论3.解决办法 前言:在生产环境中有一个后端程序多次报oom然后导致程序中断。 1.排查方式 通过下载后端程序产生的oom文件,将oom文件导入MemoryAnalyzer程序分析程序堆内存使用情况。 1、将oom文件导入MemoryAnalyzer后可以看到概览信…

玩转扩展库,温湿度传感器篇!—合宙Air201资产定位模组LuatOS快速入门05

随着LuatOS快速入门系列教程的推出,小伙伴们学习热情高涨。 合宙Air201不仅支持三种定位方式,还具有丰富的扩展功能,通过外扩BTB链接方案,最多可支持21个IO接口:SPI、I2C、UART等多种接口全部支持。 本期&#xff0c…

uniapp小程序富文本编辑器 简单不需要下载插件 复制代码直接复用

题外话:富文本编辑器搞了好久,下载好几个插件,都没成功,最后复制这篇文章的代码,我又修改了一点东西,就成功了:(买下面的css文件还花了2块钱,现在我免费给大家&#xff0…