关于opencv的学习(四)

这次学习的是直方图操作和傅里叶变换等操作。

目录

直方图

mask操作:

 均衡化

傅里叶变换:


直方图

这是有关直方图库的引用。

 cv2.calcHist(images,channels,mask,histSize,ranges)
images 原图像格式uint8或float32.当传入函数时应用中括号[]
channels同样用中括号来它会告诉我们图像的直方图,如果图像是灰度图就是[0],如果是彩色图的参数可以是[0][1][2]他们分别对应着BGR
mask掩模图像,统整幅图像的直方图为 None,如果你想要一部分,你就做一个掩模图像并使用
hisSize:BIN的数目,也用中括号
ranges [0-256]

#直方图:

img =cv2.imread('cat.jpg',0)   #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])   #记得加中括号
print(hist.shape)
plt.hist(img.ravel(),256)
plt.show()

我们会得到类似与上述的直方图。

img =cv2.imread('cat.jpg')
print(img.shape)
color =('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color=col)
    plt.xlim([0,256])
plt.show()

 使用上述操作,可以得到三个颜色通道的折线图:

mask操作:

掩码=蒙版?

mask = np.zeros(img.shape[:2],np.uint8)  #创建一个黑色的与img同尺寸的图像
print(mask.shape)
mask[100:200,100:367]=255      #设置区域,把需要保存的区域设置成255
cv_show('a',mask)

 可以得到如下的图像:

 黑色的区域代表遮掩,白色的区域表示可以,

masked =cv2.bitwise_and(img,img,mask=mask)   #与操作,不是和掩膜与,而是两个img与,然后只输出掩膜不为0的部分
cv_show('b',masked)

histr = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.plot(histr,color='b')
plt.xlim([0,256])
plt.show()

我们再来看一下变化后的折线图:

我们会发现更靠近中间了。

 均衡化

均衡化过程:直方图均衡化保证在图像像素映射过程中原来的大小关系保持不变,即较亮的区域依旧较亮,较暗的依旧较暗,只是对比度增加,不能明暗颠倒;保证像素映射函数的值域在0和255之间。 累积分布函数是单增长函数,并且值域是0到1。

 均衡的目的是为了增加图像对比度?

#均衡:增强图像对比度?
img1 =cv2.imread('dog.jpg',0)
plt.hist(img.ravel(),256)
plt.show()


equ=cv2.equalizeHist(img1)
plt.hist(equ.ravel(),256)
plt.show()

res=np.hstack((img1,equ))
cv_show('d',res)

      

第一张是均衡化操作之前的,我们会发现,图像直方图更加突出,第二章是均衡化操作之后的,图像直方图会显得更加的平滑。

 

 这是操作前和操作后的对比。

 自适应直方图均衡化,用分块操作,整体效果会更好,但是边缘会有点明显的分块状

#自适应直方图均衡化:分块?有利有弊
clahe =cv2.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))    #clipLimit剪辑限制   tileGridSize平铺网格大小
res_ = clahe.apply(img1)
res=np.hstack((img1,equ,res_))
cv_show('e',res)

三张图的对比:

傅里叶变换:


#频域?堆叠?时域换个方向?

#高频:变化剧烈的灰度分量,边界
#低频:变化缓慢

#低通滤波器:只保留低频,图像模糊
#高通滤波器:只保留高频, 细节增强
#opencv中cv2.dft()和cv2.idft(),输入图像需要先转换成np.flota32格式(时域的结果)
#得到的结果频率为0的部分会在左上角,通常要转换到中心位置,可以通过shift来实现
#cv2.dft()返回的结果是双通道的(实,虚),通常还要转换成图像格式才能展示(0,255)

傅里叶变换是一种函数在空间域和频率域的变换,从空间域到频率域的变换是傅里叶变换,而从频率域到空间域是傅里叶的反变换
时域与频域:

 频域(frequency domain)
是指在对函数或信号进行分析时,分析其和频率有关部份,而不是和时间有关的部份,和时域一词相对。
 时域
是描述数学函数或物理信号对时间的关系。例如一个信号的时域波形可以表达信号随着时间的变化。若考虑离散时间,时域中的函数或信号,在各个离散时间点的数值均为已知。若考虑连续时间,则函数或信号在任意时间的数值均为已知。在研究时域的信号时,常会用示波器将信号转换为其时域的波形。
 两者相互间的变换
时域(信号对时间的函数)和频域(信号对频率的函数)的变换在数学上是通过积分变换实现。对周期信号可以直接使用傅立叶变换,对非周期信号则要进行周期扩展,使用拉普拉斯变换。
————————————————
版权声明:本文为CSDN博主「ShaneHolmes」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33208851/article/details/94834614

 这里引用一下ShaneHolmes的文章来解释一下时域和频域.

img = cv2.imread('dog.jpg',0)
img_ = np.float32(img)

dft =cv2.dft(img_,flags=cv2.DFT_COMPLEX_OUTPUT)
dft_=np.fft.fftshift(dft)   #将低频值转换到中间

mag = 20*np.log(cv2.magnitude(dft_[:,:,0],dft_[:,:,1]))#20*是为了方便查看

plt.subplot(121),plt.imshow(img,cmap='gray')  #gary报错???
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(mag,cmap='gray')
plt.title('Magn'),plt.xticks([]),plt.yticks([])
plt.show()

#低频在中间

将低频转换到了中间,我们来看一下图像:

低频都集中了中间,白点处附近。

通过低通滤波实现的逆过程

img = cv2.imread('dog.jpg',0)
img_ = np.float32(img)

dft =cv2.dft(img_,flags=cv2.DFT_COMPLEX_OUTPUT)
dft_=np.fft.fftshift(dft)   #将低频值转换到中间

row,cols = img.shape#图像的shape值大小
crow,cool = int(row/2),int(cols/2) #中心点位置

#低通滤波
mask =np.zeros((row,cols,2),np.uint8)
mask[crow-30:crow+30,cool-30:cool+30]=1

#IDFT(逆过程)
fshift = dft_*mask
f_shift = np.fft.ifftshift(fshift)
img_back = cv2.idft(f_shift)
img_back = cv2.magnitude(img_back[:,:,0],img_back[:,:,1])

plt.subplot(121),plt.imshow(img,cmap='gray')  #gary报错???
plt.title('Input Image'),plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(img_back,cmap='gray')
plt.title('Result'),plt.xticks([]),plt.yticks([])
plt.show()

会使图像的颜色更柔和,也会使图像变的模糊

而高通滤波的逆过程只需要改变一下mask就行:

#高通滤波:
mask =np.ones((row,cols,2),np.uint8)
mask[crow-30:crow+30,cool-30:cool+30]=0  #区别

 会使图像的细节更加的凸显。另外在频域中做处理更方便,更高效。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值