搜索内容

有一个问题?

如果您有任何疑问,可以在下面询问或输入您要寻找的!

[Python图像处理] 三十七.OpenCV直方图统计两万字详解(掩膜直方图、灰度直方图对比、黑夜

生成海报
Eastmount
Eastmount 2021-02-06 00:12
阅读需:0

该系列产品文章内容是解读Python OpenCV图象处理专业知识,早期关键解读图象新手入门、OpenCV基本使用方法,中后期解读图象处理的各种各样优化算法,包含图像锐化算法、图像复原技术性、图像分割等,中后期融合深度神经网络科学研究图像识别技术、图像分类运用。期待文章内容对您有一定的协助,如果有存在的不足,还请海涵~

前边一篇文章详细介绍了图象几何变换,包含:图象平移变换、图象放缩转换、图象旋转变换、图象镜像系统转换、图象仿射变换和图象透视变换;本文将详解条形图统计分析,包含Matplotlib和OpenCV绘图条形图、掩膜条形图、灰度条形图比照及根据条形图预测分析夜晚大白天,万字文章梳理,期待对您有一定的协助。 另外,该一部分专业知识均为创作者查看材料编写小结,而且设立变成收费标准栏目,为宝宝挣点婴儿奶粉钱,感谢你们的抬爱。自然假如您是在学学员或经济拮据,能够私信我给你每章文章内容开授权管理,或是分享全文让你,更期待您能发展,一起加油喔~

  • https://github.com/eastmountyxz/ImageProcessing-Python

文章内容文件目录

  • 一.图象条形图简述
  • 二.Matplotlib绘图条形图
  • 三.OpenCV绘图条形图
  • 四.掩膜条形图
  • 五.图象灰度变换条形图比照
    • 1.灰度移位转换图象条形图比照
    • 2.灰度变弱图象条形图比照
    • 3.图象反色转换条形图比照
    • 4.图象对数变换条形图比照
    • 5.图象阀值化解决条形图比照
  • 六.图象H-S条形图
  • 七.条形图分辨夜晚大白天
  • 八.小结

前文参照:

  • [Python图象处理] 一.图象处理基本知识及OpenCV新手入门涵数
  • [Python图象处理] 二.OpenCV+Numpy库载入与改动清晰度
  • [Python图象处理] 三.获得图象特性、兴趣爱好ROI地区及安全通道解决
  • [Python图象处理] 四.图象光滑之均值滤波、框架过滤、高斯滤波及中值滤波
  • [Python图象处理] 五.边缘检测、加法运算及图象类型转换
  • [Python图象处理] 六.图象放缩、图象转动、图象旋转与图象平移变换
  • [Python图象处理] 七.图象阀值化解决及优化算法比照
  • [Python图象处理] 八.图象浸蚀与图象澎涨
  • [Python图象处理] 九.组织学之图象开计算、闭计算、梯度方向计算
  • [Python图象处理] 十.组织学之图象顶帽计算和白帽黑客计算
  • [Python图象处理] 十一.灰度条形图定义及OpenCV绘图条形图
  • [Python图象处理] 十二.图象几何变换之图象仿射变换、图象透视变换和图象校准
  • [Python图象处理] 十三.根据灰度三维图的图象顶帽计算和白帽黑客计算
  • [Python图象处理] 十四.根据OpenCV和清晰度解决的图象灰度化解决
  • [Python图象处理] 十五.图象的灰度线性变换
  • [Python图象处理] 十六.图象的灰度离散系统转换之对数变换、伽马转换
  • [Python图象处理] 十七.图像锐化与图像分割之Roberts算法、Prewitt算法、Sobel算法和Laplacian算法
  • [Python图象处理] 十八.图像锐化与图像分割之Scharr算法、Canny算法和LOG算法
  • [Python图象处理] 十九.图像分割之根据K-Means聚类算法的区域分割
  • [Python图象处理] 二十.图象量化分析解决和取样解决及部分马塞克动画特效
  • [Python图象处理] 二十一.图像金字塔之图象往下抽样和往上抽样
  • [Python图象处理] 二十二.Python图象傅里叶变换基本原理及完成
  • [Python图象处理] 二十三.傅里叶变换之高通滤波和低通滤波
  • [Python图象处理] 二十四.图象动画特效解决之半透明背景、浮雕图案和漆料动画特效
  • [Python图象处理] 二十五.图象动画特效解决之素描画、复古、阳光照射、岁月及其ps滤镜动画特效
  • [Python图象处理] 二十六.图像分类基本原理及根据KNN、朴素贝叶斯优化算法的图像分类实例
  • [Python图象处理] 二十七.OpenGL新手入门及绘图基本图形(一)
  • [Python图象处理] 二十八.OpenCV迅速完成人脸识别算法及视頻中的面部
  • [Python图象处理] 二十九.MoviePy视频剪辑库完成抖音小视频裁切合拼实际操作
  • [Python图象处理] 三十.图象量化分析及取样解决万字详尽小结(强烈推荐)
  • [Python图象处理] 三十一.图象点计算解决2万字详尽小结(灰度化解决、阀值化解决)
  • [Python图象处理] 三十二.傅里叶变换(图像去噪)与霍夫变换(特点鉴别)万字详尽小结
  • [Python图象处理] 三十三.图象各种各样动画特效解决及基本原理万字详细说明(半透明背景、浮雕图案、素描画、复古、岁月、ps滤镜等)
  • [Python图象处理] 三十四.图像处理基本与图形绘图万字详细说明(强烈推荐)
  • [Python图象处理] 三十五.OpenCV图象处理新手入门、算术或运算与边缘检测(强烈推荐)
  • [Python图象处理] 三十六.OpenCV图象几何变换万字详细说明(平移变换放缩转动、镜像系统仿射透視)
  • [Python图象处理] 三十七.OpenCV和Matplotlib绘图条形图万字详细说明(掩膜条形图、H-S条形图、夜晚大白天分辨)

图象灰度条形图(Histogram)是灰度级遍布的涵数,是对图象中灰度级遍布的统计分析。灰度条形图是将彩色图像中的全部清晰度,依照灰度级的尺寸,统计分析其发生的頻率并绘图有关图型。此章关键解读Matplotlib和OpenCV绘图条形图的二种方式 ,比照了灰度解决优化算法前后左右的条形图,完成掩膜条形图绘图、图象H-S条形图、条形图分辨夜晚大白天等內容。

一.图象条形图简述

灰度条形图是灰度级的涵数,叙述的是图象中每个灰度级清晰度的数量,体现图象中每个灰度发生的頻率。假定存有一幅6×6清晰度的图象,然后统计分析其1至6灰度级的发生頻率,并绘图如图所示1所显示的柱形图,在其中横坐标轴表明灰度级,纵轴表明灰度级发生的頻率。

在这里插入图片描述

假如灰度级为0-255(极小值0为灰黑色,最高值255为乳白色),一样能够绘图相匹配的条形图,如图2所显示,左侧是一幅二值化(Lena灰度图),右侧是相匹配各像素数的灰度级頻率。

在这儿添加图片叙述

为了更好地让图象各灰度级的发生频数产生固定不动规范的方式,能够根据归一化方法对图象条形图开展解决,将未处理的初始图象转化成相对的规范方式[3]。假定自变量r表明图象中清晰度灰度级,归一化处理之后将r限制在以下范畴:

在这里插入图片描述

在灰度级中,r为0时表明灰黑色,r为1时表明乳白色。针对一幅给出图象,每一个清晰度值坐落于[0,1]区段以内,然后测算初始图象的灰度遍布,用概率密度函数P®完成。为了更好地能够更好地开展图像处理,务必引进离散变量方式。在离散变量方式下,用rk表明离散变量灰度级,P(rk)替代P®,并达到公式计算(2)。

在这里插入图片描述

公式计算中,nk为图象中发生rk这类灰度的图像分辨率,n是图象中清晰度数量,是摡率论中的频数,l是灰度级数量(一般l为256级灰度)。然后在直角坐标中作出rk和P(rk)的关系网,则变成灰度级的条形图。

假定存有一幅3×3清晰度的图象,其清晰度值如公式计算(9-3)所显示,则归一化条形图的流程以下:

在这里插入图片描述

  • 最先统计分析各灰度级相匹配的清晰度数量。用x二维数组统计分析像素数的灰度级,y二维数组统计分析具备该灰度级的清晰度数量。在其中,灰度为1的清晰度共3个,灰度为2的清晰度共一个,灰度为3的清晰度共两个,灰度为4的清晰度共一个,灰度为5的清晰度共两个。

在这里插入图片描述

  • 然后统计分析总清晰度数量,如公式计算(5)所显示。

在这里插入图片描述

  • 最终统计分析各灰度级的发生几率,根据公式计算(6)开展测算,其結果以下:

在这里插入图片描述

绘图的归一化图行如图所示3所显示,横坐标轴表明图象中每个像素数的灰度级,纵轴表明发生这一灰度级的几率。

在这里插入图片描述

条形图被广泛运用于人工智能算法行业,在应用边沿和色调明确物件界限时,根据条形图能能够更好地挑选界限阀值,开展阀值化解决。另外,条形图对物件与情况有较强比照的景色的切分尤其有效,能够运用于检验视頻中情景的转换及图象中的兴趣爱好点,简易物件的总面积和综合性光密度IOD还可以根据图象的条形图测算而得。


二.Matplotlib绘图条形图

Matplotlib是Python强劲的数据信息数据分析工具,关键用以绘图各种各样3D图型。本小标题Python绘图条形图关键启用matplotlib.pyplot库文件hist()涵数完成,它会依据数据库和清晰度级绘图条形图。其涵数关键包含五个常见的主要参数,以下所显示:

  • n, bins, patches = plt.hist(arr, bins=50, normed=1, facecolor=‘green’, alpha=0.75)
    – arr表明必须测算条形图的一维数组
    – bins表明条形图表明的柱数,选择项,初始值为10
    – normed表明是不是将获得的条形图开展空间向量归一化处理,初始值为0
    – facecolor表明条形图色调
    – alpha表明清晰度
    – n为传参,表明条形图空间向量
    – bins为传参,表明每个bin的区段范畴
    – patches为传参,表明回到每一个bin里边包括的数据信息,是一个目录

图象条形图的Python完成编码以下所显示,该实例主要是根据matplotlib.pyplot库文件的hist()函数绘制的。留意,载入的“picture.bmp”图象的清晰度为二维数组,而hist()涵数的数据库务必是一维数组,一般必须根据涵数ravel()弄直图象。

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
#载入照片
img = cv2.imread('lena.bmp')

#灰度变换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#条形图均衡解决
result = cv2.equalizeHist(gray)

#表明图象
plt.subplot(221)
plt.imshow(gray, cmap=plt.cm.gray), plt.axis("off"), plt.title('(a)') 
plt.subplot(222)
plt.imshow(result, cmap=plt.cm.gray), plt.axis("off"), plt.title('(b)') 
plt.subplot(223)
plt.hist(img.ravel(), 256), plt.title('(c)') 
plt.subplot(224)
plt.hist(result.ravel(), 256), plt.title('(d)') 
plt.show()

载入表明的“lena”二值化如图4所显示。

在这里插入图片描述

最后的灰度条形图如图所示5所显示,它将Lena图256级灰度和每个灰度级的频数绘图出去,在其中x轴表明图象的256级灰度,y轴表明每个灰度级的频数。

在这里插入图片描述

假如启用下述涵数,则绘图的条形图是历经标准化处理,而且色调为翠绿色、清晰度为0.75的条形图,如图所示6所显示。

  • plt.hist(src.ravel(), bins=256, density=1, facecolor=‘green’, alpha=0.75)

在这里插入图片描述

五颜六色条形图是高维空间条形图的充分必要条件,它统计分析彩色的图片RGB各份量发生的頻率,即五颜六色概率分布函数信息内容。彩色的图片的条形图和灰度条形图一样,仅仅各自绘制三个安全通道的条形图,随后再开展累加,其编码以下所显示。Lena五颜六色初始图象如图所示7所显示。

在这里插入图片描述

#coding:utf-8
# By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
src = cv2.imread('Lena.png')

#获得BGR三个安全通道的清晰度值
b, g, r = cv2.split(src)
print(r,g,b)

#绘图条形图
plt.figure("Lena")
#深蓝色份量
plt.hist(b.ravel(), bins=256, density=1, facecolor='b', edgecolor='b', alpha=0.75)
#翠绿色份量
plt.hist(g.ravel(), bins=256, density=1, facecolor='g', edgecolor='g', alpha=0.75)
#鲜红色份量
plt.hist(r.ravel(), bins=256, density=1, facecolor='r', edgecolor='r', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.show()

#表明初始图象
cv2.imshow("src", src)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘图的五颜六色条形图如图所示8所显示,包含鲜红色、翠绿色、深蓝色三种比照。

在这里插入图片描述

假如期待将三个色调份量的柱形图分离绘图并开展比照,则应用以下编码完成,启用plt.figure(figsize=(8, 6))函数绘制对话框,及其plt.subplot()涵数各自绘图4个子图。

#coding:utf-8
# By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#载入图象
src = cv2.imread('Lena.png')

#变换为RGB图象
img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

#获得BGR三个安全通道的清晰度值
b, g, r = cv2.split(src)
print(r,g,b)

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

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

#初始图象
plt.subplot(221)
plt.imshow(img_rgb)
plt.axis('off')
plt.title("(a)原图象")

#绘图深蓝色份量条形图
plt.subplot(222)
plt.hist(b.ravel(), bins=256, density=1, facecolor='b', edgecolor='b', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.title("(b)深蓝色份量条形图")

#绘图翠绿色份量条形图
plt.subplot(223)
plt.hist(g.ravel(), bins=256, density=1, facecolor='g', edgecolor='g', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.title("(c)翠绿色份量条形图")

#绘图鲜红色份量条形图
plt.subplot(224)
plt.hist(r.ravel(), bins=256, density=1, facecolor='r', edgecolor='r', alpha=0.75)
plt.xlabel("x")
plt.ylabel("y")
plt.title("(d)鲜红色份量条形图")
plt.show()

最后輸出的图型如图所示9所显示,,图9(a)表明原图象,图9(b)表明深蓝色份量条形图,图9©表明翠绿色份量条形图,图9(d)表明红色分类条形图。

在这儿添加图片叙述


三.OpenCV绘图条形图

前一小标题解读了怎样启用matplotlib库绘图条形图,下面解读应用OpenCV库绘图条形图的方式 。在OpenCV中能够应用calcHist()函数计算条形图,测算进行以后选用OpenCV中的制图涵数,如绘图矩形框的rectangle()涵数,绘图直线的line()涵数来进行。在其中,cv2.calcHist()的函数原型及普遍六个主要参数以下:

  • hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)
    – hist表示条形图,回到一个二维数组
    – images表明键入的初始图象
    – channels表明特定安全通道,安全通道序号必须应用中括号,键入图象是二值化时,它的数值[0],数字图像则为[0]、[1]、[2],各自表明深蓝色(B)、翠绿色(G)、鲜红色(R)
    – mask表明可选择的实际操作掩码。假如要统计分析整副图象的条形图,则该数值None;假如要统计分析图象的某一部分条形图时,必须掩码来测算
    – histSize表明灰度级的数量,必须应用中括号,例如[256]
    – ranges表明清晰度值范畴,例如[0, 255]
    – accumulate表明总计累加标志,默认设置为false,假如被设定为true,则条形图在逐渐分派时不容易被清零,该主要参数容许从好几个目标中测算多带带条形图,或是用以自动更新条形图;好几个条形图的积累結果用以对一组图象的条形图测算

下面的编码是测算图象各灰度级的尺寸、样子及频数,然后启用plot()函数绘制条形图曲线图。

#encoding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#载入图象
src = cv2.imread('lena.bmp')

#测算256灰度级的图象条形图
hist = cv2.calcHist([src], [0], None, [256], [0,255])

#輸出条形图尺寸、样子、总数
print(hist.size)
print(hist.shape)
print(hist)

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

#表明初始图象和绘图的条形图
plt.subplot(121)
plt.imshow(src, 'gray')
plt.axis('off')
plt.title("(a)Lena二值化")

plt.subplot(122)
plt.plot(hist, color='r')
plt.xlabel("x")
plt.ylabel("y")
plt.title("(b)条形图曲线图")
plt.show()

所述编码绘图的“Lena”二值化所相匹配的条形图曲线图如图所示10所示,图10(a)表明原图象,图10(b)表明相匹配的灰度条形图曲线图。

在这里插入图片描述

另外輸出条形图的尺寸、样子及总数,以下所显示:

256
(256L, 1L)
[[7.000e+00]
 [1.000e+00]
 [0.000e+00]
 [6.000e+00]
 [2.000e+00]
 ....
 [1.000e+00]
 [3.000e+00]
 [2.000e+00]
 [1.000e+00]
 [0.000e+00]]

数字图像启用OpenCV绘图条形图的优化算法与二值化一样,仅仅从B、G、R三个放量上涨各自开展测算及绘图,详细编码。

#encoding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#载入图象
src = cv2.imread('Lena.png')

#变换为RGB图象
img_rgb = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

#测算条形图
histb = cv2.calcHist([src], [0], None, [256], [0,255])
histg = cv2.calcHist([src], [1], None, [256], [0,255])
histr = cv2.calcHist([src], [2], None, [256], [0,255])

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

#表明初始图象和绘图的条形图
plt.subplot(121)
plt.imshow(img_rgb, 'gray')
plt.axis('off')
plt.title("(a)Lena初始图象")

plt.subplot(122)
plt.plot(histb, color='b')
plt.plot(histg, color='g')
plt.plot(histr, color='r')
plt.xlabel("x")
plt.ylabel("y")
plt.title("(b)条形图曲线图")
plt.show()

最后绘图的“Lena”数字图像以及相匹配的五颜六色条形图曲线图如图所示11所显示,在其中图11(a)表明Lena初始图象,图11(b)表明相匹配的五颜六色条形图曲线图。

在这里插入图片描述


四.掩膜条形图

假如要统计分析图象的某一部分条形图,就必须应用掩码(蒙板)来开展测算。假定即将统计分析的一部分设定为乳白色,一部分设定为灰黑色,随后应用该掩膜开展条形图绘图,其详细编码以下所显示。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

#载入图象
img = cv2.imread('yxz.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()

其运作結果如图所示12所显示,它应用了一个200×200清晰度的掩膜开展试验。在其中图12(a)表明初始图象,图12(b)表明200×200清晰度的掩膜,图12©表明初始图象开展掩膜解决,图12(d)表明条形图曲线图,深蓝色曲线图为初始图象的灰度级条形图遍布状况,翠绿色起伏更小的曲线图为掩膜条形图曲线图。

在这里插入图片描述


五.图象灰度变换条形图比照

前边详解了图象灰度变换和阀值转换,本小标题将融合条形图各自比照图象灰度变换前后左右的转变,便捷阅读者更清楚地了解灰度变换和阀值转换。

  • [Python图象处理] 三十一.图象点计算解决2万字详尽小结(灰度化解决、阀值化解决)

1.灰度移位转换图象条形图比照

图象灰度移位转换应用的关系式为:

  • DB=DA+50

该优化算法将完成图象灰度级的移位,进而提高图象的色度,融合条形图比照的完成编码以下所显示。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
img = cv2.imread('lena.bmp')

#图象灰度变换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#获得图象高宽比和总宽
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#图象灰度移位转换 DB=DA+50
for i in range(height):
    for j in range(width):
        if (int(grayImage[i,j]+50) > 255):
            gray = 255
        else:
            gray = int(grayImage[i,j]+50)
        result[i,j] = np.uint8(gray)

#测算原照的条形图
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#测算灰度变换的条形图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#初始图象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#绘图掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#绘图掩膜设定后的图象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#绘图条形图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其运作結果如图所示13所显示,在其中(a)表明初始图象,(b)表明相匹配的灰度条形图,(c)表明灰度移位后的图象,(d)是相匹配的条形图。比照发觉,图13(d)比图13(b)的灰度级总体高了50,曲线图总体往右边平移变换了50个企业。

在这里插入图片描述


2.灰度变弱图象条形图比照

该优化算法将变弱图象的饱和度,应用的关系式为:

  • DB=DA×0.8

Python融合条形图完成灰度饱和度变弱的编码以下所显示。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
img = cv2.imread('lena.bmp')

#图象灰度变换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#获得图象高宽比和总宽
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#图象饱和度变弱转换 DB=DA×0.8
for i in range(height):
    for j in range(width):
        gray = int(grayImage[i,j]*0.8)
        result[i,j] = np.uint8(gray)

#测算原照的条形图
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#测算灰度变换的条形图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#初始图象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#绘图掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#绘图掩膜设定后的图象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#绘图条形图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其运作結果如图所示14所示,在其中(a)和(b)表明初始图象和相匹配的灰度条形图,(c)和(d)表明灰度变弱或饱和度变小的图象及相匹配的条形图。图14(d)比图14(b)的灰度级总体变小了0.8倍,绘图的曲线图更为聚集。

在这里插入图片描述


3.图象反色转换条形图比照

该优化算法将图象的色调反色,对原图象的清晰度值开展翻转,即灰黑色变成乳白色,乳白色变成灰黑色,应用的关系式为:

  • DB=255-DA

完成编码以下所显示。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
img = cv2.imread('lena.bmp')

#图象灰度变换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#获得图象高宽比和总宽
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#图象灰度反色转换 DB=255-DA
for i in range(height):
    for j in range(width):
        gray = 255 - grayImage[i,j]
        result[i,j] = np.uint8(gray)

#测算原照的条形图
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#测算灰度变换的条形图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#初始图象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#绘图掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#绘图掩膜设定后的图象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#绘图条形图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其运作結果如图所示15所显示,在其中(a)和(b)表明初始图象和相匹配的灰度条形图,(c)和(d)表明灰度反色转换图象及相匹配的条形图。图15(d)与图15(b)是反相对性称的,全部灰度级达到DB=255-DA关系式。

在这里插入图片描述


4.图象对数变换条形图比照

该优化算法将提升低灰度地区的饱和度,进而提高暗部的关键点,应用的关系式为:

在这里插入图片描述

下边的编码完成了图象灰度的对数变换及条形图比照。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
img = cv2.imread('lena.bmp')

#图象灰度变换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#获得图象高宽比和总宽
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#图象灰度对数变换
for i in range(height):
    for j in range(width):
        gray = 42 * np.log(1.0 + grayImage[i,j])
        result[i,j] = np.uint8(gray)

#测算原照的条形图
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#测算灰度变换的条形图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#初始图象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#绘图初始图象条形图
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#灰度变换后的图象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#灰度变换图象的条形图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其运作結果如图16所显示,在其中(a)和(b)表明初始图象和相匹配的灰度条形图,(c)和(d)表明灰度对数变换图象及相匹配的条形图。

在这里插入图片描述


5.图象阀值化解决条形图比照

该优化算法原形为:

  • threshold(Gray,127,255,cv2.THRESH_BINARY)

当今像素数的灰度级超过thresh阀值时(如127),其像素数的灰度级设置为最高值(如9位灰度级较大 为255);不然,像素数的灰度级设定为0。二进制阀值化解决及条形图比照的Python编码以下所显示。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
img = cv2.imread('lena.bmp')

#图象灰度变换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#获得图象高宽比和总宽
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)

#图象灰度对数变换
for i in range(height):
    for j in range(width):
        gray = 42 * np.log(1.0 + grayImage[i,j])
        result[i,j] = np.uint8(gray)

#测算原照的条形图
hist = cv2.calcHist([img], [0], None, [256], [0,255])

#测算灰度变换的条形图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])

#初始图象
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')

#绘图初始图象条形图
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")

#灰度变换后的图象
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')

#灰度变换图象的条形图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()

其运作結果如图所示17所显示,在其中(a)和(b)表明初始图象和相匹配的灰度条形图,(c)和(d)表明图象阀值化解决及相匹配的条形图,图17(d)中能够见到,灰度级只是遍布于0(灰黑色)和255(乳白色)二种灰度级。

在这里插入图片描述


六.图象H-S条形图

为了更好地描绘图象中色调的形象化特点,经常必须剖析图象的HSV室内空间下的条形图特点。HSV室内空间是由色彩(Hue)、对比度(Saturation)、及其色度(Value)组成,因而在开展条形图测算时,必须先将源RGB图象转换为HSV颜色空间图象,随后将相匹配的H和S安全通道开展模块区划,再其二维空间上测算相对性应条形图,再测算条形图室内空间上的最高值并归一化绘图相对的条形图信息内容,进而产生色彩-对比度条形图(或H-S条形图)。该条形图一般运用在目标检测、现状分析及其总体目标特点追踪等情景。

因为H和S份量和人体会色调的方法是紧密相连,V份量与图象的五颜六色信息内容不相干,这种特性促使HSV实体模型特别适合于依靠人的视觉识别系统来认知五颜六色特点的图象处理优化算法。下边编码是实际的完成编码,应用matplotlib.pyplot库文件的imshow()涵数来绘图具备不一样色调投射的3D条形图。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2  
import numpy as np
import matplotlib.pyplot as plt

#载入图象
img = cv2.imread('Lena.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()

图18(a)表明初始键入图象,图18(b)是原图象相匹配的五颜六色条形图,在其中X轴表明对比度(S),Y轴表明色彩(H)。在条形图中,能够见到H=140和S=130周边的一些低值,它相匹配于鲜丽的色彩。

在这里插入图片描述


七.条形图分辨夜晚大白天

然后叙述2个运用条形图的实例,第一个是根据条形图来分辨一幅图象是夜晚或大白天。普遍的方式 是根据测算图象的灰度均值、灰度中值或灰度标准偏差,再与自定的阀值开展比照,进而分辨是夜晚還是大白天。

  • 灰度均值:该值相当于图象中全部清晰度灰度级之和除于图象的清晰度数量。
  • 灰度中值:对图象中全部清晰度灰度级开展排列,随后获得全部清晰度最正中间的值,即是灰度中值。
  • 灰度标准偏差:又常称均方差,是离均差平方米的算术平均数的平方根。标准偏差能体现一个数据的离散程度,是整体各企业指标值两者之间平均值离差平方米的算术平均数的平方根。假如一幅图看上去雾蒙蒙的, 那灰度标准偏差就小;假如一幅图看上去很艳丽,那饱和度就非常大,标准偏差也大。

下边的编码是测算灰度“Lena”图的灰度均值、灰度中值和灰度标准偏差。

#coding:utf-8
#By:Eastmount CSDN 2021-02-05
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.bmp')

#图象灰度变换
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)

其运作結果如图所示9-19所显示,图9-19(a)为初始图象,图9-19(b)为事件处理。其灰度均值为123,灰度中值为129,灰度标准偏差为48.39。

在这里插入图片描述

下边解读另一种用于分辨图象是大白天還是夜晚的方式 ,其基础流程以下:

  • 载入初始图象,变换为灰度图,并获得图象的全部清晰度值;
  • 设定灰度阀值并测算该阀值下列的清晰度数量。例如清晰度的阀值设定为50,统计分析小于50的清晰度值数量;
  • 设定占比主要参数,比照该主要参数与小于该阀值的清晰度占有率,假如小于主要参数则预测分析为大白天,高过主要参数则预测分析为夜晚。例如该基本参数为0.8,清晰度的灰度级小于阀值50的数量占整副图象全部清晰度数量的90%,则觉得该图象发暗,故预测分析为夜晚;不然预测分析为大白天。

实际完成的编码以下所显示。

#encoding:utf-8
#By:Eastmount CSDN 2021-02-05
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()

第一张测试图輸出的結果如图所示20所显示,在其中图20(a)为初始图象,图20(b)为相匹配条形图曲线图,最后輸出結果为“(‘This picture is bright!’, 0.010082704388303882)”,该预测分析为大白天。

在这里插入图片描述

第二张测试图輸出的結果如图所示21所显示,在其中图21(a)为初始图象,图21(b)为相匹配条形图曲线图,最后輸出結果为“(‘This picture is dark!’, 0.8511824175824175)”,该预测分析为夜晚。

在这里插入图片描述

最终填补一段三维条形图编码,也请学生们出来开展深层次的了解及试着。

# -*- coding: utf-8 -*-
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes三维
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter

#载入图象
img = cv.imread("yxz.png")
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
imgd = np.array(img)      #image类转numpy

#提前准备数据信息
sp = img.shape
h = int(sp[0])        #图象高宽比(rows)
w = int(sp[1])        #图象总宽(colums) of image

#制图原始解决
fig = plt.figure(figsize=(16,12))
ax = fig.gca(projection="3d")

x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
x, y = np.meshgrid(x,y)
z = imgd
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)  

#自定z轴
ax.set_zlim(-10, 255)
ax.zaxis.set_major_locator(LinearLocator(10))   #设定z轴分隔线的亲疏
#将z的value字符串数组变为float并保存2位小数
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) 

# 设定纵坐标的label和题目
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
ax.set_title("surface plot", weight='bold', size=20)

#加上右边的色卡对照表条
fig.colorbar(surf, shrink=0.6, aspect=8)  
plt.show()

輸出結果如下图所显示:

在这里插入图片描述


八.小结

写到这儿,文中就详细介绍结束。本文关键解读图象条形图有关知识要点,包含Matplotlib和OpenCV二种统计分析及绘图条形图的方式 ,然后解读了掩膜条形图和H-S条形图,并融合灰度变换比照了普遍优化算法转换前后左右的条形图,运用条形图完成夜晚和大白天的分辨。另外,阅读者能够试着以前的文章内容和条形图开展各种各样绘图,例如均衡解决、动画特效解决这些,下面的图便是图象均衡的条形图。

在这儿添加图片叙述

  • 源代码下载详细地址,还记得帮助点star和关心喔。
    https://github.com/eastmountyxz/ImageProcessing-Python

岁月嘀嗒嘀嗒的外流,它是我还在CSDN写出的第八篇年度总结,比过去情况下来的更早一些。《敏而多思,宁静致远》,仅为此篇留念这风雨同舟的一年,这心怀感恩的一年。一转眼宝宝大白天了,嘿嘿~提早祝大家春节快乐!

  • 2020年小结:敏而多思,宁静而致远——留念这风雨同舟的一年

2020年8月18新开业的“娜璋AI安全之家”,关键紧紧围绕Python数据分析、网络环境安全性、人工智能技术、Web渗入及防御技术性开展解读,另外共享CCF、SCI、南核北核毕业论文的优化算法完成。娜璋世家会更为系统软件,并重新构建创作者的全部文章内容,从零解读Python和安全性,写了近十年文章内容,真想着把自己学过所想所做共享出去,还请诸位多多关照,真心实意邀约您的关心!感谢。

在这里插入图片描述

(By:Eastmount 2021-02-06 夜里12点 http://blog.csdn.net/eastmount/ )


论文参考文献,在这里谢谢这种巨头,共同进步!

  • [1] 罗子江, 杨秀璋. Python中的图象处理[M]. 2020.
  • [2]冈萨雷斯. 图像处理(第三版)[M]. 北京市:电子工业出版社出版, 2013.
  • [3]张恒博, 欧宗瑛. 一种根据颜色和灰度条形图的图像检索方式 [J]. 计算机科学, 2004.
  • [4]Eastmount. [图像处理] 四.MFC提示框绘图灰度条形图[EB/OL]. (2015-05-31). https://blog.csdn.net/eastmount/article/details/46237463.
  • [5]苗锡奎, 孙劲光, 张语涵. 图象归一化与伪Zernike矩的鲁棒性图片水印优化算法科学研究[J]. 计算机技术科学研究, 2010.
  • [6]阮秋琦. 图像处理学(第三版)[M]. 北京市:电子工业出版社出版, 2008.
  • [7]Eastmount. [Python图象处理] 十一.灰度条形图定义及OpenCV绘图条形图[EB/OL]. (2018-11-06). https://blog.csdn.net/Eastmount/article/details/83758402.
  • [8]李立源, 龚坚. 根据二维灰度条形图最好一维投射的图像分割方式 [J]. 自动化学报, 1996.
  • [9]杨秀璋, 颜娜. Python互联网数据爬取及剖析从新手入门到熟练(剖析篇)[M]. 北京市:北京市航空航天高校出版社出版, 2018.
  • [10]毛星云, 冷雪飞. OpenCV3编程学习[M]. 北京市:电子工业出版社出版, 2015.
  • [11]思索海数_willschang. Opencv-Python学习心得七——图象条形图 calcHist,条形图均衡equalizeHist[EB/OL]. (2018-08-26). https://www.jianshu.com/p/bd12c4273d7d.
  • [12]ZJE_ANDY. python3+opencv 运用灰度条形图来分辨照片的亮暗状况[EB/OL]. (2018-06-20). https://blog.csdn.net/u014453898/article/details/80745987.
评论
  • 消灭零回复