首页 > 编程语言 >【python版CV】-直方图 & 傅里叶变换

【python版CV】-直方图 & 傅里叶变换

时间:2023-02-15 11:37:02浏览次数:33  
标签:plt img python mask shape cv 直方图 图像 CV


文章目录

  • ​​1、直方图​​
  • ​​mask操作:​​
  • ​​shape学习​​
  • ​​图像基本运算:​​
  • ​​直方图均衡化​​
  • ​​2、傅里叶变换​​
  • ​​傅里叶变换的作用​​
  • ​​滤波:​​
  • ​​低通滤波器​​
  • ​​高通滤波器​​

1、直方图

说明:统计像素值,用柱形图来统计

cv.calcHist(images,channels,mask,histSize,ranges)
  • images:原图像的格式为uint8或者float32.当传入函数时,应用括号[]括起来,如:[image]
  • channels:同样用括号括起来,告诉函数我们统幅图像的直方图。如果入图像是灰度图它的值就是[0],如果是彩色图,它的值可以是[0]、[1]、[2],对应B、G、R
  • mask:掩膜图像。统整幅图像的直方图就把它设为None,但如果想统整幅图像某一部分的直方图就制作一个掩膜图像并使用它。
  • histSize: BIN的数目,括号括起来(一般固定256)
  • ranges:像素范围[0,256](一般固定)
#直方图
img=cv.imread("E:\\Pec\\cat.jpg",0)
hist=cv.calcHist([img],[0],None,[256],[0,256])
print(hist.shape)
plt.hist(img.ravel(),256)
plt.show()
#彩色图
img=cv.imread("E:\\Pec\\cat.jpg")
color=('b','g','r')
for i,col in enumerate(color):
histr=cv.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color=col)
plt.xlim([0,256])
plt.show()

【python版CV】-直方图 & 傅里叶变换_数组

【python版CV】-直方图 & 傅里叶变换_计算机视觉_02

mask操作:

掩码(mask):只有两部分,一部分为黑,另一部分为白。

img=cv.imread("E:\\Pec\\cat.jpg",0)
mask_1=np.zeros(img.shape[:2],np.uint8)
print(mask_1.shape)
#选择一些区域
mask_1[100:300,180:480]=255
#[100:300]表示上下去100位置到300,同理左右去180位置到480
cv_show('mask',mask_1)
masked_img=cv.bitwise_and(img,img,mask=mask_1)#与操作,mask表示要提取的区域
cv_show('masked_img',masked_img)
plt.subplot(221),plt.imshow(img,'gray')
plt.subplot(222),plt.imshow(masked_img,'gray')
plt.show()
#plt.subplot(221) 表示将整个图像窗口分为2行2列, 当前位置为1.
#plt.subplot(221) 表示第一行的左图
#plt.subplot(222) 表示将整个图像窗口分为2行2列, 当前位置为2.
#plt.subplot(222) 第一行的右图
#plt.plot(图线名)
#plt.xlim() 显示的是x轴的作图范围
#plt.ylim() 显示的是y轴的作图范围

【python版CV】-直方图 & 傅里叶变换_计算机视觉_03

shape学习

shape[:2] 取彩色图片的长和宽
shape[:3]取彩色图片的长和宽和通道
img.shape[0]:图像的垂直高度
img.shape[1]:图像的水平宽度
img.shape[2]:图像的通道数
矩阵中,[0]代表水平,[1]代表高度。

print(type(img)) #显示类型 print(img.shape) #显示尺寸 print(img.shape[0]) #图片宽度 print(img.shape[1]) #图片高度 print(img.shape[2]) #图片通道数 print(img.size) #显示总像素个数 print(img.max()) #最大像素值 print(img.min()) #最小像素值 print(img.mean()) #像素平均值 print(img.shape[:0]) print(img.shape[:1])#图片宽度 print(img.shape[:2])#图片宽度,高度 print(img.shape[:3])#图片宽度,高度,通道数

图像基本运算:

说明:图像的基本运算有很多种,比如两幅图像可以相加、相减、相乘、相除、位运算、平方根、对数、绝对值等;图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作,各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操作。

#bitwise_and、bitwise_or、bitwise_xor、bitwise_not这四个按位操作函数。
void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 & src2
void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 | src2
void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 ^ src2
void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray()); //dst = ~src
  • bitwise_and是对二进制数据进行“与”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“与”操作,1&1=1,1&0=0,0&1=0,0&0=0
  • bitwise_or是对二进制数据进行“或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
  • bitwise_xor是对二进制数据进行“异或”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“异或”操作,11=0,10=1,01=1,00=0
  • bitwise_not是对二进制数据进行“非”操作,即对图像(灰度图像或彩色图像均可)每个像素值进行二进制“非”操作,1=0,0=1

直方图均衡化

【python版CV】-直方图 & 傅里叶变换_数组_04


【python版CV】-直方图 & 傅里叶变换_opencv_05

img=cv.imread("E:\\Pec\\cat.jpg",0)
hist=cv.calcHist([img],[0],None,[256],[0,256])
#均衡化
equ=cv.equalizeHist(img)
plt.subplot(221),plt.hist(img.ravel(),256)
plt.subplot(222),plt.hist(equ.ravel(),256)
plt.show()
res=np.hstack((img,equ))
cv_show("red",res)

【python版CV】-直方图 & 傅里叶变换_opencv_06

【python版CV】-直方图 & 傅里叶变换_python_07

2、傅里叶变换

说明:生活在时间的世界中,早上7:00吃早饭,8:00上班路上,9:00上班,以时间为参照的时域分析。频域中看来一切都是静止的,以上帝的视角。不需要了解你什么时间按照顺序干了什么事,只需要了解你这一天干了什么就行了

傅里叶变换的作用

  • 高频:变换剧烈得到灰度分量,例如边界
  • 低频:变化缓慢的灰度分量,例如一望无际的大海

滤波:

  • 低通滤波器:只保留低频,会使图像变得模糊
  • 高通滤波器:只保留高频,会使图像细节增强

注意:

(1)输入图像需要先转换成np.float32格式

(2)得到的结果中频域为0的部分会在左上角,通常要转到中心位置,可以通过shift变换来实现

(3)cv.dft()返回的结果是双通道的(实部,虚部),通常需要转换成图像格式才能展示(0,255)

补充:

(1)numpy.zeros(shape, dtype=float)

  • 各个参数意义:
    ​​​shape​​​:创建的新数组的形状(维度)。
    ​​​dtype​​:创建新数组的数据类型。
  • 返回值:给定维度的全零数组。

(2)numpy.ones(shape, dtype=None, order=‘C’)

  • 可以创建任意维度和元素个数的数组,其元素值均为1
  • shape :int或int的序列,为新数组的形状;
  • dtype(可选 ):数组的所需数据类型;默认是 numpy.float64。
  • order : {‘C’,‘F’},可选,默认值:C 是否在内存中以行主(C-风格)或列主(Fortran-风格)顺序存储多维数据。
img=cv.imread("E:\\Pec\\lida.jpg",0)
img_float32=np.float32(img)#输入图像需要先转换成np.float32格式
#傅里叶转换为复数
dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT)
#将低频从左上角转换到中心
dft_shift=np.fft.fftshift(dft)
#得到灰度图能表示的形式
#cv.dft()返回的结果是双通道的(实部,虚部),通常需要转换成图像格式才能展示(0,255)
magnitude_spectrum=20*np.log(cv.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))
plt.subplot(121),plt.imshow(img,'gray')
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum,'gray')
plt.title('Magnitude Spectrum'),plt.xticks([]),plt.yticks([])
plt.show()

【python版CV】-直方图 & 傅里叶变换_直方图_08

低通滤波器

#低通滤波器
img=cv.imread("E:\\Pec\\lida.jpg",0)
img_float32=np.float32(img)#输入图像需要先转换成np.float32格式
#傅里叶转换为复数
dft=cv.dft(img_float32,flags=cv.DFT_COMPLEX_OUTPUT)
#将低频从左上角转换到中心
dft_shift=np.fft.fftshift(dft)
#找到图像中心位置
rows,cols=img.shape
crow,col=int(rows/2),int(cols/2)
#低通滤波
#生成rows行cols列的2纬矩阵,数据格式为uint8,uint8的范围[0,255]
mask=np.zeros((rows,cols,2),np.uint8)
mask[crow-30:crow+30,col-30:col+30]=1
#IDFT
fshift=dft_shift*mask
f_ishift=np.fft.ifftshift(fshift)
img_back=cv.idft(f_ishift)
img_back=cv.magnitude(img_back[:,:,0],img_back[:,:,1])
plt.subplot(121),plt.imshow(img,'gray')
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(img_back,'gray')
plt.title('Result'),plt.xticks([]),plt.yticks([])
plt.show()

从结果可以看出,图像的边缘模糊,但是图像除边缘部分的其他地方不模糊

【python版CV】-直方图 & 傅里叶变换_计算机视觉_09

高通滤波器

#高通滤波
#生成rows行cols列的2纬矩阵,数据格式为uint8,uint8的范围[0,255]
mask=np.ones((rows,cols,2),np.uint8)
mask[crow-30:crow+30,col-30:col+30]=0

从结果可以看出,图像只有边缘信息保存下来,内容模糊不见了

【python版CV】-直方图 & 傅里叶变换_计算机视觉_10


标签:plt,img,python,mask,shape,cv,直方图,图像,CV
From: https://blog.51cto.com/u_14935708/6058969

相关文章

  • 【Python21天学习挑战赛】—Day1:学习规划,我与python的相遇
    大学实验室指导老师说过:“学习是无聊的。没有人说学习是快乐的,那是扯淡!”。是的,学习是无聊的,但是学习到的知识丰富我们自己是快乐的。我喜欢把自己每天所学的知识通过平台分......
  • 【OpenCV】-边缘检测汇总示例
    汇总之前:这一节还有一个scharr滤波器(也是算子)没有介绍,先介绍一下。。。1计算图像差分:Scharr()函数使用Scharr滤波器运算符计算x或y方向的图像差分,包含的参数与Sobel算子基......
  • 【python版CV】图像轮廓&模板匹配
    文章目录​​1、图像轮廓​​​​1.1findContours函数:​​​​1.2获取轮廓信息(可能会报错原因)​​​​1.3绘制轮廓:​​​​1.4轮廓特征:​​​​1.5轮廓近似:​​​​1.6......
  • 【OpenCV】-算子(Sobel、Canny、Laplacian)学习
    开头一下:本篇博客主要介绍边缘检测所涉及的三大算子,分别是Sobel算子、Canny算子、Laplacian算子)。上篇博客​​python版CV​​也介绍了这三个算子的用法。文章目录​​1、s......
  • 【python版CV】-图像处理(1)
    开头一下:上一篇学习完了图像的基础操作,这一篇博客是记录图像处理的一部分。回顾python版的OpenCV第二篇,对于相关的图像处理也有一定的了解。视频参考B站唐宇迪博士,也是来自......
  • 【python版CV】—图像基本操作
    1、数据读取-图像cv2.IMREAD_COLOR:彩色图像cv2.IMREAD_GRAYSCALE:灰度图像#输出图像函数defcv_show(name,img):cv.imshow(name,img)#等待时间,毫秒级别。0表示任意......
  • pycharm配置opencv库
    我走的弯路:对于刚刚入手OpenCV的小白,又第一次接触pycharm编译器。所以在配置opencv库的时候遇到很多问题。如下:1、如果直接在Terminal运行界面输入【pipinstallopencv-p......
  • 【OpenCV】—阈值化
    什么是阈值化?答:在对各种图形进行处理操作的过程中,需要对图像中的像素做出取舍与决策,直接剔除一些低于或者高于一定值的像素。阈值可以被视作最简单的图像分割方法。如:从一......
  • 【OpenCV】图片尺寸放缩示例程序
    这次示例程序分别演示了用resize、pyrUp、pyrDown来让源图像进行放大缩小操作#include<opencv2/opencv.hpp>#include<opencv2/imgproc/imgproc.hpp>#include<opencv2/highgu......
  • 【OpenCV】—图像金子塔与图片尺寸缩放
    序言:继续,继续,开干!!!本节学习OpenCV中的函数pyrUp和pyrDown对图像进行向上和向下采样,以及了解专门用于缩放图像尺寸的resize函数的用法文章目录​​1、引言​​​​2、关于图......