计算机视觉OpenCv学习系列:第七部分、图像操作-3

news2024/11/15 4:09:34

第七部分、图像操作-3

    • 第一节、图像统计信息
      • 1.像素值统计
      • 2.函数支持说明
      • 3.代码练习与测试
    • 第二节、图像直方图
      • 1.图像直方图定义
      • 2.直方图函数
      • 3.代码练习与测试
    • 第三节、图像直方图均衡化
      • 1.直方图均衡化
      • 2.直方图均衡化函数
      • 3.代码练习与测试
    • 学习参考

第一节、图像统计信息

1.像素值统计


对单通道来说,一个像素点除了R,G,B三个维度之外,还有两个维度表示位置信息x,y,所以一个单通道的图片,每个像素点是五个维度

对像素值进行统计与像素所处的位置无关只是单纯统计数值的大小。

(图像像素在OpenCV中相当于数组)

例如:

  • 以单通道为例

    • 均值

在这里插入图片描述

  • 均值 + 方差

  • 根据计算出来的均值和方差,可以对图像所携带的信息做出一些判断。
    比如方差,方差就是数据的分散程度(偏离均值)。图像中有个人和有辆车,那么他们的灰度值是不同的(颜色不同),你把全图像的灰度值取平均,偏离平均值越大,方差越大。方差越大,说明信息越多,能量越大。

  • 方差为0,说明该图片的像素点没有变化,是张纯色图片,说明图片不携带任何有效信息。
    在这里插入图片描述

  • 极值(最大、最小)
    在这里插入图片描述

OpenCV中多通道计算均值方差,是在每个通道上分别计算的。

2.函数支持说明


1. cv.mean(src[, mask]	) ->retval
2. cv.meanStdDev(src[, mean[, stddev[, mask]]]) ->mean, stddev
3. cv.minMaxLoc(src[, mask]) ->minVal, maxVal, minLoc, maxLoc
# src表示输入图像,mask表示计算区域,不写mask表示计算全图
# mean, stddev, minVal, maxVal分别表示均值,标准方差,最小与最大
4. Dst = (Src-mean) * contrast + mean  # 简单应用 -- 对比度

3.代码练习与测试


# 简单应用 -- 对比度
Dst = (Src-mean) * contrast + mean
# contrast < 1.0 降低对比度
# contrast > 1.0 提升对比度
# 例如,均值是70,100-70=30,当contrast=0.5时,差值变为30*0.5=15。
# 图像像素统计 -- 改变对比度 + 均值
def stats_demo_2():
    image = cv.imread(r"F:\python\opencv-4.x\samples\data\butterfly.jpg")
    cv.namedWindow("butterfly", cv.WINDOW_AUTOSIZE)
    cv.imshow("butterfly", image)
    # 计算全图均值
    bgr_m = cv.mean(image)
    # 对原图像设置低对比度
    sub_m = np.float32(image)[:, :] - (bgr_m[0], bgr_m[1], bgr_m[2])
    result = sub_m * 0.5  # 提升差值
    result = result[:, :] + (bgr_m[0], bgr_m[1], bgr_m[2])  # 提升差值之后还要把均值加上去
    cv.imshow("low-contrast-butterfly", cv.convertScaleAbs(result))  # convertScaleAbs转换为绝对值,然后转成CV_8UC
    # 对原图像设置高对比度
    result2 = sub_m * 2.0  # 提升差值
    result2 = result2[:, :] + (bgr_m[0], bgr_m[1], bgr_m[2])  # 提升差值之后还要把均值加上去
    cv.imshow("high-contrast-butterfly", cv.convertScaleAbs(result2))  # convertScaleAbs转换为绝对值,然后转成CV_8UC
    # 输出不同对比度下的图片均值
    m1 = cv.mean(image)
    m2 = cv.mean(cv.convertScaleAbs(result))
    m3 = cv.mean(cv.convertScaleAbs(result2))
    print("image:", m1)
    print("result_low:", m2)
    print("result_high:", m3)
    cv.waitKey(0)
    cv.destroyAllWindows()

结果示例:

在这里插入图片描述

上面三张图片的像素均值:可以看出均值可以反应出图片的明暗程度

在这里插入图片描述

# 图像像素统计 -- 均值、方差、极值(最大、最小)
def stats_demo_1():
    # 计算均值和方差
    roi = np.array([[5, 3, 4], [9, 6, 7], [8, 2, 3]], dtype=np.uint8)  # 定义一个3*3的数组
    mask = np.array([[0, 3, 0], [0, 6, 0], [0, 2, 0]], dtype=np.uint8)  # 定义一个mask区域
    m1 = cv.meanStdDev(roi)  # 计算全图均值,方差
    m2 = cv.meanStdDev(roi, mask=mask)  # 计算mask区域的均值,方差
    minx, maxx, minx_loc, max_loc = cv.minMaxLoc(roi)  # 计算最小值,最大值,最小值坐标,最大值坐标
    print("roi:\n", roi, "\n", "mask:\n", mask)
    print("m1:", m1, "\n", "m2: ", m2)
    print("min: ", minx, " max: ", maxx, " min_loc: ", minx_loc, " max_loc: ", max_loc)
    # 计算均值
    m3 = cv.mean(roi)  # 计算全图均值
    # 计算结果是四个值,对应四个通道,opencv使用mat(数组矩阵)来表示图片数据,其中四个通道分别表示R,G,B,透明度
    m4 = cv.meanStdDev(roi, mask=mask)  # 计算mask区域的均值和方差
    print("roi:\n", roi, "\n", "mask:\n", mask)
    print("m3: ", m3, "\n", "m4: ", m4)

结果示例:

在这里插入图片描述

第二节、图像直方图

1.图像直方图定义


图像直方图就是图像像素值的分布

例如,有图像数据8x8,像素值范围0~14共15个灰度等级,统计得到各个等级(x)出现次数(y)及直方图如右侧所示,每个紫色的长条叫BIN

在这里插入图片描述

每一个图像都可以绘制出自己的图像直方图

三个通道三个不同的直方图分布,将上图中的每个顶点连成线

在这里插入图片描述

注意:两个图像直方图相同,但是图像可能不同,因为直方图只关注了像素信息,没有关注空间位置信息。

2.直方图函数


1. calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) -> hist
# images表示图像
# channels表示通道
# mask 默认None
# histSzie表示bin的个数,横坐标的等级个数
# ranges表示通道的取值范围
# 例如 hist = cv.calcHist([image], [i], None, [32], [0, 255])
# image输入图像
# i表示通道索引
# mask=None
# 表示分为32个bin
# 表示取值范围0~256,即每个bin是256/32 = 每个范围的步长为8,即8个灰度等级
# hsv中h通道的取值范围为0-180,sv取值范围为0-255

3.代码练习与测试


# 图像直方图
def image_hist():
    image = cv.imread(r"F:\python\opencv-4.x\samples\data\ml.png")
    cv.imshow("input", image)
    color = ('blue', 'green', 'red')
    # enumerate遍历数组类型同时返回下标和对应数组值
    for i, color in enumerate(color):
        # 一共分32类,每一类256/32步长,按照B,G,R的通道顺序一次使用blue,green,red颜色绘制
        hist = cv.calcHist([image], [i], None, [32], [0, 255])
        print(hist.dtype)
        plt.plot(hist, color=color)
        plt.xlim([0, 32])
    plt.show()
    cv.waitKey(0)
    cv.destroyAllWindows()

结果示例:

在这里插入图片描述

第三节、图像直方图均衡化

1.直方图均衡化


均衡化作用

  • 提升对比度(通过拉大低值和高值之间的差距)
  • 灰度图像支持

在这里插入图片描述

  • k类别名
  • rk每类对应的等级分数
  • nk每类的像素点数
  • nk/n占总像素的比例
  • Sk表示累计(0.44 = 0.19+0.25)
  • ps(sk)表示每一个s累计之后所属类的概率

三个通道三个不同的直方图分布

在这里插入图片描述

2.直方图均衡化函数


cv.equalizeHist(src[, dst]) --> dst
# src必须是八位(0,255)单通道图像(即必须是个灰度图像)
# dst返回结果图像,类型与src保持一致

3.代码练习与测试


# 图像直方图均衡化
def image_eq_demo():
    # 直接读入灰度图片
    # image = cv.imread(r"F:\python\opencv-4.x\samples\data\lena.jpg", cv.IMREAD_GRAYSCALE)
    # 读入RGB彩色图片,切分通道,取单通道
    image = cv.imread(r"F:\python\opencv-4.x\samples\data\lena.jpg")
    image = cv.split(image)
    cv.imshow("input", image[0])
    # 提取原图的B通道作图像直方图
    hist = cv.calcHist([image[0]], [0], None, [32], [0, 255])
    print(hist.dtype)
    plt.plot(hist, color="gray")
    # 灰度等级设定为256/32 = 8
    plt.xlim([0, 32])
    plt.show()

    eqimg = cv.equalizeHist(image[0])
    cv.imshow("eq", eqimg)
    # 确保均衡化的输入是一个八位(0,255)单通道图像
    hist = cv.calcHist([eqimg], [0], None, [32], [0, 255])
    print(hist.dtype)
    plt.plot(hist, color="gray")
    plt.xlim([0, 32])
    plt.show()
    cv.waitKey(0)
    cv.destroyAllWindows()

结果示例:

发现均衡化之后对比度明显提升,并且直方图高值与低值差距拉大。

在这里插入图片描述

学习参考

本系列所有OpenCv相关的代码示例和内容均来自博主学习的网站:opencv_course

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

零基础学JavaWeb开发(二十一)之 spring框架(4)

3、AOP详解 3.1、Aop常用术语 1.连接点&#xff08;Join point&#xff09;: 连接点表示应用执行过程中能够插入切面的一个点&#xff0c;这个点可以是方法的调用、异常的抛出。在 Spring AOP 中&#xff0c;连接点总是方法的调用。类中的哪些方法可以被增强&#xff0c;这些…

详解动态规划01背包问题--JavaScript实现

对其他动态规划问题感兴趣的&#xff0c;也可以查看详解动态规划最少硬币找零问题--JavaScript实现详解动态规划最长公共子序列--JavaScript实现一开始在接触动态规划的时候&#xff0c;可能会云里雾里&#xff0c;似乎能理解思路&#xff0c;但是又无法准确地表述或者把代码写…

车辆占用应急车道识别抓拍系统 opencv

车辆占用应急车道识别抓拍系统通过opencvpython人工智能识别技术&#xff0c;对高速公路应急车道进行不间断实时监测&#xff0c;当监测到应急车道上有车辆违规占用时&#xff0c;立即告警提醒后台人员及时处理避。OpenCV的全称是Open Source Computer Vision Library&#xff…

【18】C语言 | 数组详解

目录 1、数组的格式 2、下列有什么区别 3、维数组的使用 4、*p 和 int* p arr 的含义 5、二维数组&#xff1a;打印一个二维数组 6、二维数组在数组中的存储 7、数组作为函数参数 8、数组名是数组首元素的地址 1、数组的格式 数组是一组相同类型元素的集合。 数组的创…

20230123英语学习

Interesting Studies to Spark Your Interest in the Research Field 科研也可以很有趣&#xff01;盘点那些好玩的研究 When it comes to picking studies worth reading, what scientists deem an interesting science article might be perceived differently by a person…

【Datewhale一起吃瓜 Task2】啃瓜第三章

文章目录线性模型关键&#xff1a;找到合适的w和b如何找到合适的 w和b&#xff1f;偏导为什么可以&#xff1f;推广线性模型 任务&#xff1a;找出一条线能够对数据进行划分或预测趋势 关键&#xff1a;找到合适的w和b 更适合于连续性的数值&#xff0c;如果数据是离散的如色…

AcWing 1020. 潜水员(二维费用背包)

一、问题 二、思路 这道题其实很容易看出是一个二维费用背包的变形&#xff0c;如果我们将氧气看作体积&#xff0c;将氮气看作价值的话&#xff0c;这道题就变成了从iii个物品里面选&#xff0c;体积至少为mmm&#xff0c;价值至少为nnn的条件下&#xff0c;所携带的物品的最…

Maplab:一个用于视觉惯性建图和定位研究的开源框架

摘要 鲁棒且精确的视觉惯性估计是当今机器人领域的重要挑战。能够用先验地图(prior map)进行定位(localize)并获得准确且无漂移的姿态估计&#xff0c;可以推动该系统的适应性。然而&#xff0c;目前大多数可用的解决方案都集中在单次使用&#xff0c;缺乏定位能力或端到端流水…

Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?

[1] 先讨论一个面试题 int a 1; Integer b 1; Integer c new Integer(1); Integer d Integer.valueOf(1); int e d; int f d.intValue();请问以下式子的值&#xff1f;为什么&#xff1f; a b // true a c // true b c // false[2] ""与"equals"…

C++设计新思维(泛型编程与设计模式之应用)之常整数映射为类别(2.4)

技术 模板偏特化&#xff0c;模板全特化 应用 1、有必要根据一个编译期常数调用一个或数个不同的函数 2、有必要在编译器实施"分派"(dispatch) 例子 如果打算在执行期进行分派(dispatch)&#xff0c;可使用if-else或switch语句。大部分时候其执行期成本都微不足…

windows权限维持方法详解

权限维持在获取服务器权限后&#xff0c;为了防止服务器管理员发现和修补漏洞而导致对服务器权限的丢失&#xff0c;测试人员往往需要采取一些手段来实现对目标服务器的持久化访问。权限持久化&#xff08;权限维持&#xff09;技术就是包括任何可以被测试人员用来在系统重启、…

Allegro如何通过飞线判断同一个网络连接位是否在同一直线操作指导

Allegro如何通过飞线判断同一个网络连接位是否在同一直线操作指导 Allegro可以通过飞线判断同一个网络的连接位是否在同一条直线上,如下图 当飞线是类似三角形的时候,可以判定两个连接点位是在同一条直线上 具体设置操作如下 选择Setup选择Design Parameter

React源码之render过程中发生了什么?

理解JSX 对于我们直接书写jsx语法&#xff0c;我们的浏览器是不理解我们这种语法的&#xff0c;所以需要babel来去转义&#xff0c;那么可以通过plugin-transform-react-jsx来转译jsx语法&#xff0c;使得浏览器可以识别我们的Jsx语法&#xff0c;例如&#xff1a; <div&g…

关于xshell简答使用

xshell是一个远程工具下载 官网地址&#xff1a;https://www.xshell.com/zh/xshell/直接下载即可~选择免费的授权页面 下载 不然要收费 也不要用盗版。运行后的xshell界面我们要建立服务器的连接点击加号 新建连接 即可 输入连接地址后 要输入 账号 和 秘密 OK 好了 可以使用了…

【Linux】Linux编译器gcc、g++

文章目录&#x1f3aa; Linux编译器gcc、g&#x1f680;1. 程序的编译⭐1.1 预处理⭐1.2 编译⭐1.3 汇编⭐1.4 链接⭐1.5 gcc/g常用指令&#x1f680;2. 函数库⭐2.1 静态库⭐2.2 动态库⭐2.3 动静态库对比&#x1f3aa; Linux编译器gcc、g 我们这以gcc为例&#xff0c;g编译器…

【学习笔记之数据结构】树的认识

树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它由n&#xff08;n可以为0&#xff09;个有限的节点组成一个具有层次关系的结合。之所以把它称之为树是因为它的逻辑结构形似一个倒着的树。它的根在上面&#xff0c;叶子在下面。   有一个特殊的节点&#xff0c…

WebRTC系列-Qos系列之接收NACK

文章目录 1. 主要调用流程1.1 RTCP和RTP包区分1.2 查找丢失包2. RTX在文章 WebRTC系列-Qos系列之RTP/RTCP源码分析-RTP/RTCP包解析-3的2.3.3章节介绍了NACK包在WebRTC中解析方式及RFC规定协议的定义。 这篇文章开始,详细分析其接受RTCP包到解析nack的处理流程; 1. 主要调用流…

Kotlin中空安全操作符,异常处理和自定义异常,以及先决条件函数详解

博主前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住也分享一下给大家 &#x1f449;点击跳转到教程 一、Kotlin的可空性 null 在java中我们司空见惯的空指针异常NullPointerException,带给了我们很多麻烦。 Kotlin作为更强…

STM32编写OLED显示屏驱动

文章目录前言一、OLED的器件地址二、编写写数据和写命令函数三、编写初始化OLED屏幕函数四、其他功能函数编写五、显示字符和数字函数编写总结前言 这篇文章将带大家学习如何编写OLED显示屏的驱动程序。这里我使用的是HAL库的硬件IIC&#xff0c;OLED屏幕使用的是SSD1306的。 …

sbt编程语言scala的构建工具配置及项目构建(附带网盘下载)

SBT简介 SBT 是 Scala 的构建工具&#xff0c;全称是 Simple Build Tool&#xff0c; 类似 Maven 或 Gradle。 Java可以用Maven快速构建项目&#xff0c;scala用SBT快速构建一个Scala项目。 sbt下载官网 百度网盘链接&#xff1a;https://pan.baidu.com/s/1eJkdWndZ0izcd3w…