《计算机视觉技术与应用》-----第六章 直方图
创始人
2024-03-20 20:16:22

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 系列文章目录
  • 前言
  • 一、遇到的问题
  • 二、使用hist()函数绘制直方图
  • 三、用calcHist()函数查找直方图
  • 3、应用掩模的直方图
  • 四、NumPy中的直方图
  • 五、直方图均衡化
  • 六、限制对比度自适应直方图均衡化
  • 七、二维直方图
  • 八、实验一 使用Numpy函数计算直方图
  • 九、实验2 使用OpenCV函数计算直方图
  • 总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、遇到的问题

在做第一个实验室,遇到一个问题:plt.show()无法输出直方图,都没有一闪而过,直接就输出不了图。
在这里插入图片描述
后来经过我排查后,发现是环境的问题,我装的是anaconda,然后在base环境里面出现这个问题,由于之前在这个环境里面跑了许多实验,有删除matplotlib依赖项的嫌疑。后来我重新创建了一个虚拟环境解决该问题。

conda create -n CV python=3.9  #在conda里面创环境命令格式是这样的,conda create -n 环境名 python=版本号

另外,当conda isntall 包名 太慢时,可以用pip install 包名来下载。

二、使用hist()函数绘制直方图

BINS=16
在这里插入图片描述
BINS=256
在这里插入图片描述

#test6-1.py:使用hist()函数绘制直方图
""" 函数说明matplotlib.pyplot.hist(src,bins)src为绘制直方图的图像数据,必须是一维数组。一般OpenCV中的BGR图像是三维数组,所以需要用ravel()函数转换为一维数组bins为灰度级分组数量,将灰度级按一定范围进行划分得到的子集数量为BINS。灰度图像灰度级范围[0,255],按16个灰度级分为一组,可以分成16个子集,则BINS为16
"""
import cv2
import matplotlib.pyplot as plt 
img=cv2.imread('gate.jpg')  		     #读取图像
cv2.imshow('original',img)  	        #显示原图像
plt.hist(img.ravel(),16)               #绘制直方图
plt.show()                              #显示直方图

三、用calcHist()函数查找直方图

在这里插入图片描述

#test6-2.py:查找和绘制直方图
""" 函数说明hist = cv2.calcHist(image,channels,mask,histSize,ranges)hist是返回的直方图,是一个一维数组,其大小为256,保存了原图像中各个灰度级数量image为原图,实际参数需要用方括号括起来channels为通道编号,灰度图像的通道编号为[0],BGR图像的通道编号为[0][1][2]"""
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('gate.jpg')  		     			#读取图像
cv2.imshow('original',img)  	        				#显示原图像
histb=cv2.calcHist([img],[0],None,[256],[0,255])	#计算B通道直方图 返回值是一维数组
histg=cv2.calcHist([img],[1],None,[256],[0,255])	#计算G通道直方图
histr=cv2.calcHist([img],[2],None,[256],[0,255])	#计算R通道直方图
plt.plot(histb,color='b')               			#绘制B通道直方图,蓝色
plt.plot(histg,color='g')               			#绘制G通道直方图,绿色
plt.plot(histr,color='r')               			#绘制R通道直方图,红色
plt.show()                              				#显示直方图

3、应用掩模的直方图

在这里插入图片描述

#test6-3.py:掩模中的直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('gate.jpg')  		     #读取图像
cv2.imshow('original',img)  	        #显示原图像
w,h,d=img.shape
mask=np.zeros((w,h), np.uint8)#按原图大小创建一幅黑色图像
w1=np.int0(w*0.25)  #宽度等分成四份,此处等效于w/4
w2=np.int0(w*0.75)
h1=np.int0(h*0.25)
h2=np.int0(h*0.75)
mask[w1:w2,h1:h2]=255               #设置掩模白色区域
cv2.imshow('mask',mask)  	        #显示掩模图像
histb=cv2.calcHist([img],[0],mask,[256],[0,255])#计算B通道直方图 这里没有写None,表明只需要统计部分图像
histg=cv2.calcHist([img],[1],mask,[256],[0,255])#计算G通道直方图
histr=cv2.calcHist([img],[2],mask,[256],[0,255])#计算R通道直方图
plt.plot(histb,color='b')               #绘制B通道直方图,蓝色
plt.plot(histg,color='g')               #绘制G通道直方图,绿色
plt.plot(histr,color='r')               #绘制R通道直方图,红色
plt.show()                              #显示直方图

四、NumPy中的直方图

在这里插入图片描述

#test6-4.py:Numpy中的直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('gate.jpg')  		     #读取图像
cv2.imshow('original',img)  	        #显示原图像
histb,e1=np.histogram(img[0].ravel(),256,[0,256])#计算B通道直方图
histg,e2=np.histogram(img[1].ravel(),256,[0,256])#计算G通道直方图
histr,e3=np.histogram(img[2].ravel(),256,[0,256])#计算R通道直方图
plt.plot(histb,color='b')               			#绘制B通道直方图,蓝色
plt.plot(histg,color='g')               			#绘制G通道直方图,绿色
plt.plot(histr,color='r')               			#绘制R通道直方图,红色
plt.show()                                          #显示直方图

五、直方图均衡化

在这里插入图片描述

#test6-5.py:直方图均衡化
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('bee.jpg',0) 	        #显示原图像 flags = 0, 8位深度,1通道
cv2.imshow('original',img)  	        #显示原图像
plt.figure('原图的直方图')
plt.hist(img.ravel(),256)               #绘制原直方图
img2=cv2.equalizeHist(img)
cv2.imshow('equalizeHist',img2)  	      #显示均衡化后的图像
plt.figure('均衡化后的直方图')
plt.hist(img2.ravel(),256)               #绘制均衡化后图像的直方图
plt.show()                              #显示直方图

六、限制对比度自适应直方图均衡化

在这里插入图片描述

#test6-6.py:限制对比度自适应直方图均衡
import cv2
import matplotlib.pyplot as plt
img=cv2.imread('clahe.jpg',0) 	            #打开图像,0表示单通道灰度图
cv2.imshow('original',img)  	            #显示原图像
img2=cv2.equalizeHist(img)
cv2.imshow('equalizeHist 直方图均衡化后的图像',img2)  	        #显示直方图均衡化后的图像
clahe=cv2.createCLAHE(clipLimit=5)          #创建CLAHE  clipLimit=5 对比度受限的阈值是5,默认值是40 #tileGridSize是直方图均衡化的网格大小,默认值是(8,8)
img3 = clahe.apply(img)                     #应用CLAHE
cv2.imshow('CLAHE 应用限制对比度自适应直方图均衡化后的图像',img3)  	                #显示应用LCAHE后的图像
cv2.waitKey(0)

七、二维直方图

在这里插入图片描述

#test6-7.py:OpenCV中的二维直方图
import cv2
img=cv2.imread('building.jpg') 	                #打开图像
cv2.imshow('original',img)  	            #显示原图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 	#转换色彩空间为HSV
hist = cv2.calcHist([img2], [0, 1], None, [180, 256], [0, 180, 0, 256])       #计算颜色直方图
cv2.imshow('2Dhist',hist)  	                #显示颜色直方图
import matplotlib.pyplot as plt
plt.imshow(hist,interpolation = 'nearest')  #绘制颜色直方图
plt.show()                                  #显示颜色直方图
cv2.waitKey(0)
#test6-8.py:Numpy中的二维直方图
import cv2
import numpy as np
img=cv2.imread('building.jpg') 	                #打开图像
cv2.imshow('original',img)  	            #显示原图像
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 	#转换色彩空间为HSV
h,s,v=cv2.split(img2)
hist,x,y=np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])#计算颜色直方图
cv2.imshow('2Dhist',hist)  	                #显示灰度颜色直方图
import matplotlib.pyplot as plt
plt.imshow(hist,interpolation = 'nearest')  #绘制颜色直方图
plt.show()                                  #显示颜色直方图
cv2.waitKey(0)

八、实验一 使用Numpy函数计算直方图

在这里插入图片描述

#test6-9.py:使用Numpy函数计算直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('home.jpg') 	                        #打开图像
plt.figure('程序运行结果')                                  #设置窗口标题
imgrgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)          #BGR转换为RGB
plt.subplot(2,2,1)                                  #添加子图窗口
plt.imshow(imgrgb)   	                            #显示原图像,默认为RGB
plt.title('original')                               #设置子图窗口标题
plt.axis('off')                                     #不显示坐标轴
histb,e1=np.histogram(img[0].ravel(),256,[0,256])   #计算B通道直方图
histg,e2=np.histogram(img[1].ravel(),256,[0,256])   #计算G通道直方图
histr,e3=np.histogram(img[2].ravel(),256,[0,256])   #计算R通道直方图
plt.subplot(2,2,2)
plt.plot(histb,color='b')               			#绘制B通道直方图,蓝色
plt.plot(histg,color='g')               			#绘制G通道直方图,绿色
plt.plot(histr,color='r')               			#绘制R通道直方图,红色
plt.title('hist')                                   #设置子图窗口标题
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 	        #转换色彩空间为HSV
h,s,v=cv2.split(img2)
hist,x,y=np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])        #计算颜色直方图
plt.subplot(2,1,2)
plt.title('2Dhist')                                 #设置子图窗口标题
plt.imshow(hist)                                    #绘制颜色直方图
plt.show()                                          #显示颜色直方图

九、实验2 使用OpenCV函数计算直方图

在这里插入图片描述

#test6-9.py:使用OpenCV函数计算直方图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img=cv2.imread('flower.jpg') 	                        #打开图像
plt.figure('程序运行结果')                                  #设置窗口标题
imgrgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)          #BGR转换为RGB
plt.subplot(2,2,1)                                  #添加子图窗口
plt.imshow(imgrgb)   	                            #显示原图像,默认为RGB
plt.title('original')                               #设置子图窗口标题
plt.axis('off')                                     #不显示坐标轴
histb=cv2.calcHist([img],[0],None,[256],[0,255])	#计算B通道直方图
histg=cv2.calcHist([img],[1],None,[256],[0,255])	#计算G通道直方图
histr=cv2.calcHist([img],[2],None,[256],[0,255])	#计算R通道直方图
plt.subplot(2,2,2)
plt.plot(histb,color='b')               			#绘制B通道直方图,蓝色
plt.plot(histg,color='g')               			#绘制G通道直方图,绿色
plt.plot(histr,color='r')               			#绘制R通道直方图,红色
plt.title('hist')                                   #设置子图窗口标题
img2=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) 	        #转换色彩空间为HSV
hist = cv2.calcHist([img2], [0, 1], None, [180, 256], [0, 180, 0, 256])               #计算颜色直方图
plt.subplot(2,1,2)
plt.title('2Dhist')                                 #设置子图窗口标题
plt.imshow(hist)                                    #绘制颜色直方图
plt.show()                                          #显示颜色直方图

总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...