码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图


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

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

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

    文章目录

    • 一.图像掩膜直方图
    • 二.图像HS直方图
    • 三.直方图判断白天黑夜
    • 四.总结

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

    • https://github.com/eastmountyxz/Python-zero2one
    • 开源600多页电子书:https://github.com/eastmountyxz/HWCloudImageRecognition

    前文赏析:

    第一部分 基础语法

    • [Python从零到壹] 一.为什么我们要学Python及基础语法详解
    • [Python从零到壹] 二.语法基础之条件语句、循环语句和函数
    • [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象

    第二部分 网络爬虫

    • [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例
    • [Python从零到壹] 五.网络爬虫之BeautifulSoup基础语法万字详解
    • [Python从零到壹] 六.网络爬虫之BeautifulSoup爬取豆瓣TOP250电影详解
    • [Python从零到壹] 七.网络爬虫之Requests爬取豆瓣电影TOP250及CSV存储
    • [Python从零到壹] 八.数据库之MySQL基础知识及操作万字详解
    • [Python从零到壹] 九.网络爬虫之Selenium基础技术万字详解(定位元素、常用方法、键盘鼠标操作)
    • [Python从零到壹] 十.网络爬虫之Selenium爬取在线百科知识万字详解(NLP语料构造必备技能)

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

    • [Python从零到壹] 十一.数据分析之Numpy、Pandas、Matplotlib和Sklearn入门知识万字详解(1)
    • [Python从零到壹] 十二.机器学习之回归分析万字总结全网首发(线性回归、多项式回归、逻辑回归)
    • [Python从零到壹] 十三.机器学习之聚类分析万字总结全网首发(K-Means、BIRCH、层次聚类、树状聚类)
    • [Python从零到壹] 十四.机器学习之分类算法三万字总结全网首发(决策树、KNN、SVM、分类算法对比)
    • [Python从零到壹] 十五.文本挖掘之数据预处理、Jieba工具和文本聚类万字详解
    • [Python从零到壹] 十六.文本挖掘之词云热点与LDA主题分布分析万字详解
    • [Python从零到壹] 十七.可视化分析之Matplotlib、Pandas、Echarts入门万字详解
    • [Python从零到壹] 十八.可视化分析之Basemap地图包入门详解
    • [Python从零到壹] 十九.可视化分析之热力图和箱图绘制及应用详解
    • [Python从零到壹] 二十.可视化分析之Seaborn绘图万字详解
    • [Python从零到壹] 二十一.可视化分析之Pyechart绘图万字详解
    • [Python从零到壹] 二十二.可视化分析之OpenGL绘图万字详解
    • [Python从零到壹] 二十三.十大机器学习算法之决策树分类分析详解(1)
    • [Python从零到壹] 二十四.十大机器学习算法之KMeans聚类分析详解(2)
    • [Python从零到壹] 二十五.十大机器学习算法之KNN算法及图像分类详解(3)
    • [Python从零到壹] 二十六.十大机器学习算法之朴素贝叶斯算法及文本分类详解(4)
    • [Python从零到壹] 二十七.十大机器学习算法之线性回归算法分析详解(5)
    • [Python从零到壹] 二十八.十大机器学习算法之SVM算法分析详解(6)
    • [Python从零到壹] 二十九.十大机器学习算法之随机森林算法分析详解(7)
    • [Python从零到壹] 三十.十大机器学习算法之逻辑回归算法及恶意请求检测应用详解(8)
    • [Python从零到壹] 三十一.十大机器学习算法之Boosting和AdaBoost应用详解(9)
    • [Python从零到壹] 三十二.十大机器学习算法之层次聚类和树状图聚类应用详解(10)

    第四部分 Python图像处理基础

    • [Python从零到壹] 三十三.图像处理基础篇之什么是图像处理和OpenCV配置
    • [Python从零到壹] 三十四.OpenCV入门详解——显示读取修改及保存图像
    • [Python从零到壹] 三十五.图像处理基础篇之OpenCV绘制各类几何图形
    • [Python从零到壹] 三十六.图像处理基础篇之图像算术与逻辑运算详解
    • [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
    • [Python从零到壹] 三十八.图像处理基础篇之图像几何变换(平移缩放旋转)
    • [Python从零到壹] 三十九.图像处理基础篇之图像几何变换(镜像仿射透视)
    • [Python从零到壹] 四十.图像处理基础篇之图像量化处理
    • [Python从零到壹] 四十一.图像处理基础篇之图像采样处理
    • [Python从零到壹] 四十二.图像处理基础篇之图像金字塔向上取样和向下取样

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

    • [Python从零到壹] 四十三.图像增强及运算篇之图像点运算和图像灰度化处理
    • [Python从零到壹] 四十四.图像增强及运算篇之图像灰度线性变换详解
    • [Python从零到壹] 四十五.图像增强及运算篇之图像灰度非线性变换详解
    • [Python从零到壹] 四十六.图像增强及运算篇之图像阈值化处理
    • [Python从零到壹] 四十七.图像增强及运算篇之腐蚀和膨胀详解
    • [Python从零到壹] 四十八.图像增强及运算篇之形态学开运算、闭运算和梯度运算
    • [Python从零到壹] 四十九.图像增强及运算篇之顶帽运算和底帽运算
    • [Python从零到壹] 五十.图像增强及运算篇之图像直方图理论知识和绘制实现
    • [Python从零到壹] 五十一.图像增强及运算篇之图像灰度直方图对比分析万字详解
    • [Python从零到壹] 五十二.图像增强及运算篇之图像掩膜直方图和HS直方图

    第六部分 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("(c)图像掩膜处理")
    
    #绘制直方图
    plt.subplot(224)
    plt.plot(hist_full)
    plt.plot(hist_mask)
    plt.title("(d)直方图曲线")
    plt.xlabel("x")
    plt.ylabel("y")
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    其运行结果如图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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    图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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    其运行结果如图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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    第一张测试图输出的结果如图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.
  • 相关阅读:
    你知道网关 架构是如何演进?
    springcloud05——Zookeeper实现支付微服务
    [pytorch笔记]02-主要组成模块&基础实战
    七 Jenkins创建任务实现自动化运维部署
    如何给一个 HTAP 数据库做基准测试?StoneDB学术分享会第4期
    家居建材供应链模式盘点,数商云供应链SCM系统助力企业做好采购计划管理
    随机过程基础知识(二)
    智能汽车“旋风”下,云巨头分列“演兵”
    【项目管理】原则之四--聚焦于价值
    个人博客测试报告
  • 原文地址:https://blog.csdn.net/Eastmount/article/details/126370183
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号