网站后台管理系统怎么做的,网站编程所用的语言有,来几个好看的网站,旅游目的地网站建设计算机视觉#xff08;OpenCVTensorFlow#xff09; 文章目录 计算机视觉#xff08;OpenCVTensorFlow#xff09;前言7. 图像直方图绘制直方图绘制直方图有两种方式#xff1a; 掩膜 8. 直方图均衡化直方图均衡化的介绍直方图均衡化的步骤自适应直方图均衡化 9. 图像转换…计算机视觉OpenCVTensorFlow 文章目录 计算机视觉OpenCVTensorFlow前言7. 图像直方图绘制直方图绘制直方图有两种方式 掩膜 8. 直方图均衡化直方图均衡化的介绍直方图均衡化的步骤自适应直方图均衡化 9. 图像转换傅里叶变换在频域中的图像OpenCV中使用傅里叶变换高通滤波和低通滤波 总结 前言
本系列文章是OpenCV系列文章的第四篇仍然跟随上篇内容主要聚焦于图像的一些操作到本篇为止与图像有关的所有的基本操作我们就都总结完了 7. 图像直方图 图像直方图顾名思义就是x轴是像素值y是像素的数量 下图就是一个图像直方图像素值为250的数量大概是500个 Opencv给我们提供的函数是cv2.calcHist()该函数有5个参数
image输入图像传入时应该用中括号括起来也就是我们可以传入多张数据channels传入图像的通道如果是灰度图像那只有一个通道值为0如果是彩色图像那么值为012中选择一个对应着BGR各个通道这个值也要[]传入mask掩膜图像如果统计整幅图那么为none,如果我们只是统计图的一部分的直方图那就要构造相应的掩膜实现这个之后我们再具体说histSize灰度级的个数需要中括号比如[256]ranges像素值的范围通常[0,256]有的图像如果不是需要自己调整这个值
hist是256x1的数组每个值对应于该图像中具有相应像素值的像素数
img cv2.imread(cat.jpg,0) #0表示灰度图
hist cv2.calcHist([img],[0],None,[256],[0,256])绘制直方图 绘制直方图有两种方式
使用Matplotlib Matplotlib带有直方图绘图功能matplotlib.pyplot.hist()
它直接找到直方图并将其绘制。无需使用 calcHist() 或 np.histogram() 函数来查找直方图
img cv2.imread(cat.jpg,0) #0表示灰度图
hist cv2.calcHist([img],[0],None,[256],[0,256])
plt.hist(img.ravel(),256);
plt.show()或者还可以使用Matplotlib的法线图
img cv2.imread(cat.jpg)
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]) 使用OpenCV用OpenCV的话就有点麻烦还要对hist数组进行变化所以就用Matplotlib就可以了。
掩膜 如果我们要查找图像某些区域的直方图只需在要查找直方图的区域上创建白色图像不查找的创建黑色。然后这个只有白色和黑色的图像就是一个掩膜。 掩膜其实就是用了与操作因为要显示的区域掩膜上是255255换算成二进制8个1任何数跟1做与运算都是它本身那也就是任何数跟255做与运算都是它本身那这不就是保留了原来的值了嘛。而又因为不想保留的地方是黑色的任何数与0做与运算都是0所以就把不想保留的地方变成了黑色的 # 先创建一个都是0的数组然后将部分区域变成白色
mask np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] 255
cv_show(mask,mask)
# 导入一张灰度图
img cv2.imread(cat.jpg, 0)
# 相应位置做与运算
masked_img cv2.bitwise_and(img, img, maskmask)#与操作
# 传入mask统计部分区域的图像直方图
hist_mask cv2.calcHist([img], [0], mask, [256], [0, 256])8. 直方图均衡化
https://blog.csdn.net/zaishuiyifangxym/article/details/89813977
直方图均衡化的介绍 ** 直方图均衡化是一种简单有效的图像增强技术通过改变图像的直方图来改变图像中各个像素的灰度主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间造成图像不够清晰。**例如过曝光图像的灰度级集中在高亮度范围内而曝光不足图像的灰度级集中在低亮度范围内。 ** 通过直方图均衡化可以把原始图像的直方图变换成均匀分布的形式这样就增加了像素之间灰度值差别的动态范围从而达到增强图像整体对比度的效果。** 简而言之直方图均衡化的原理是对在图像中像素个数多的灰度值即对画面起主要作用的灰度值进行展宽而对像素个数少的灰度值即对画面不起主要作用的灰度值进行归并从而增大对比度使图像清晰。
直方图均衡化的步骤
计算累计直方图将累计直方图进行区间转换在累计直方图中概率相近的原始值会被处理为相同值
具体的例子** 如下图所示已知一幅图像的像素分布为 7**
7根据像素值则可以计算出统计直方图 根据统计直方图可以算出归一化直方图和累计直方图如下图所示 将累计直方图进行区间转换如下图所示
我们看均衡直方图1对应3这个3是说明像素级1的共有3个那像素级为1的就有2个2-03-14-15-06-17-1,我们可以看到有两个都是0那相比于原来不就少了两个像素级嘛上面的灰度级是8那灰度级转变成256计算方法类似如下图所示
! 原始直方图和均衡直方图为
由上图可以看出虽然二者相似但右侧均衡化后的直方图分布更均匀相邻像素级概率和与高概率近似相等。如果将两张图的灰度级放在同一区间可以看出差别更大如下图所示 在OpenCV中我们用 equ cv2.equalizeHist(img) 这个函数就可以均衡化
# 均衡化之前
img cv2.imread(clahe.jpg,0) #0表示灰度图 #clahe
plt.hist(img.ravel(),256);
plt.show()
# 均衡化之后
equ cv2.equalizeHist(img)
plt.hist(equ.ravel(),256)
plt.show()均衡化之前 均衡化之后 自适应直方图均衡化 下图是均衡化的前后对比可以看到背景的对比度是增强了但是雕像的脸却变亮了许多我们在那里丢失了大多数的信息这是因为均衡化是默认是对全图进行均衡化我们也可以分模块进行均衡化这样就可以处理的更好。 在OpenCV 中我们用 clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8)) 函数来做自适应变化
titleGridSize 进行像素均衡化的网格大小即在多少网格下进行直方图的均衡化操作clipLimit颜色对比度限制阈值默认为40
# 创建一个clear对象
clahe cv2.createCLAHE(clipLimit2.0, tileGridSize(8,8))
# 让图像交给clear对象处理
res_clahe clahe.apply(img) 9. 图像转换 傅里叶变换 傅里叶变换在很多领域都有很重要的运用那么在图像处理中也有许多的运用如果有朋友不是很了解的话可以看下面这篇文章 https://zhuanlan.zhihu.com/p/19763358傅里叶变换在图像中的运用
图像增强与图像去噪图像分割与边缘检测图像特征提取图像压缩
大家看傅里叶变换在图像中的运用我们或多或少在前都提到过比如这个图像增强图像去噪图像分割和边缘检测但是那些都是在时域上的操作如果把图像放到频域中那这些操作会更轻松。简单来说傅里叶变换的目的并不是为了观察图像的频率分布至少不是最终目的更多情况下是为了对频率进行过滤通过修改频率以达到图像增强、图像去噪、边缘检测、特征提取、压缩加密等目的。
在频域中的图像
下面是图像在频域中的一些概念
图像的频率是表征图像中灰度变化剧烈程度的指标是灰度在平面空间上的梯度图像高频分量图像突变部分在某些情况下指图像边缘信息某些情况下指噪声更多是两者的混合低频分量图像变化平缓的部分也就是图像轮廓信息高通滤波器让图像使低频分量抑制高频分量通过低通滤波器与高通相反让图像使高频分量抑制低频分量通过带通滤波器使图像在某一部分的频率信息通过其他过低或过高都抑制还有个带阻滤波器是带通的反。
OpenCV中使用傅里叶变换 如果有朋友想要快速上手在OpenCV中使用傅里叶变换只需要记住 傅立叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数、傅立叶变换提供另外一个角度来观察图像可以将图像从灰度分布转化到频率分布上来观察图像的特征。对一张图像做傅里叶变换就是将它分解为 sin 和 cos 两部分也就是将图像从空间域转换到频域。 import numpy as np
import cv2
from matplotlib import pyplot as plt
# 导入一张灰度图
img cv2.imread(lena.jpg,0)
# 将图像转换为float32的格式
img_float32 np.float32(img)
# OpenCV的傅里叶变换函数输出的是图像经过傅里叶变换后的结果
dft cv2.dft(img_float32, flags cv2.DFT_COMPLEX_OUTPUT)
# 此时图像频谱中的零频率分量位于频谱图像频域图像的左上角
# 通常使用 numpy.fft.fftshift() 来将零频率成分移动到频域图像的中心位置
dft_shift np.fft.fftshift(dft)
# 我们得到的是一个复数数组为了显示图像需要将他们的值调到 [0,255] 的灰度空间中
magnitude_spectrum 20*np.log(cv2.magnitude(dft_shift[:,:,0],dft_shift[:,:,1]))plt.subplot(121),plt.imshow(img, cmap gray)
plt.title(Input Image), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(magnitude_spectrum, cmap gray)
plt.title(Magnitude Spectrum), plt.xticks([]), plt.yticks([])
plt.show()右边的图是左边图的频谱图
那频谱图是什么呢具体的解释大家可以看这篇文章https://blog.csdn.net/u014488388/article/details/52612456?t1496943343720utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-52612456-blog-94553357.pc_relevant_3mothn_strategy_and_data_recoveryspm1001.2101.3001.4242.1utm_relevant_index3 那简单的解释就是 可以将频谱的中心看做坐标原点横轴为x轴纵轴是y轴建立坐标系。 频谱平面上的坐标X,Y的黑白表示图像是否含有z sin(Xw Yw)这个正弦平面波成分白即是有含有。 但是最后的图是我们经过对数运算后的图原本的图看起来不是很清晰所以我们用对数运算将对比度放大了看的就比较清晰了 未经对数运算的频谱 高通滤波和低通滤波 刚才我们得到了这张图片的频谱图那下面我们就要对这个频谱图进行操作 https://blog.csdn.net/weixin_51995147/article/details/124767050?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-124767050-blog-71699582.pc_relevant_landingrelevantspm1001.2101.3001.4242.1utm_relevant_index3
import numpy as np
import cv2
from matplotlib import pyplot as plt
# 导进一张图片
img cv2.imread(lena.jpg,0)
# 转换为 float32的格式
img_float32 np.float32(img)
# 傅里叶变换
dft cv2.dft(img_float32, flags cv2.DFT_COMPLEX_OUTPUT)
# 将低频移到中间
dft_shift np.fft.fftshift(dft)
# 求图片的中心位置
rows, cols img.shape
crow, ccol int(rows/2) , int(cols/2) # 中心位置# 低通滤波图像中心的是低频我们想要保留低频过滤高频就用一个掩膜中心的是1其他是0
mask np.zeros((rows, cols, 2), np.uint8)
mask[crow-30:crow30, ccol-30:ccol30] 1# IDFT傅里叶的逆变换
# 用频谱图乘掩膜那最后就中心的保留了其他都是0
fshift dft_shift*mask
# 将低频的再移到原来的位置
f_ishift np.fft.ifftshift(fshift)
# 进行傅里叶的逆变换
img_back cv2.idft(f_ishift)
# 将实部和虚部结合
img_back cv2.magnitude(img_back[:,:,0],img_back[:,:,1])plt.subplot(121),plt.imshow(img, cmap gray)
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() 总结
那到本期OpenCV有关的图像基本操作我们已经全部就介绍完了但是只是草草地介绍这个一下的话那对于学习本身是毫无意义的所以接下来的一遍我们将引入一个银行卡号图像检测的实战内容帮助大家理解上述讲过的所有图像操作
我是Mayphry从一点点到亿点点我们下次再见