《OpenCV数字图像处理》课件-单元9进一步认识数字图像_第1页
《OpenCV数字图像处理》课件-单元9进一步认识数字图像_第2页
《OpenCV数字图像处理》课件-单元9进一步认识数字图像_第3页
《OpenCV数字图像处理》课件-单元9进一步认识数字图像_第4页
《OpenCV数字图像处理》课件-单元9进一步认识数字图像_第5页
已阅读5页,还剩22页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元9进一步认识数字图像OpenCV数字图像处理目录/CONENTS图像的直方图频域转换检测图像中的特征图像颜色的量化01020304图像的直方图01绘制直方图直方图是一个二维图像,横坐标表示像素值范围,纵坐标表示这一范围内的像素数量横坐标的每个像素值范围称为一个箱子(bin),箱子的数量可以任意设定一个灰度图像及其有256个箱的直方图OpenCV计算直方图01绘制直方图OpenCV定义了计算直方图的函数:hist=cv2.calcHist(img,ch,mask,histSize,ranges)其中:

img:一组图像组成的矩阵。

ch:对哪个或哪几个img矩阵中的图像计算直方图。

mask:掩膜矩阵,如果不为None,就只对掩膜窗口内的局部区域计算直方图。

histSize:直方图像素值范围的一维矩阵,如果有多个图像,每个图像依次设定。

ranges:指定直方图箱子边界的矩阵。通过matplotlib绘制直方图,利用plt.plot显示像素值与像素数量关系,调整x轴范围以适应直方图显示直方图结果02绘制直方图importcv2frommatplotlibimportpyplotaspltimage=cv2.imread("imgs/swan.jpg",cv2.IMREAD_GRAYSCALE)cv2.imshow("0",image)hist=cv2.calcHist([image],[0],None,[256],[0,256])plt.figure()plt.title("GrayscaleHistogram")plt.xlabel("Bins")plt.ylabel("NumberofPixels")plt.plot(hist)plt.xlim([0,256])plt.show()cv2.waitKey(0)直方图均衡化应用通过非线性拉伸,改善图像灰度分布,增强对比度,突出图像细节。直方图均衡化效果均衡化后图像对比度增强,像素分布更均匀,提升图像质量。直方图均衡化处理OpenCV定义的直方图均衡化函数如下:dist=cv2.equalizeHist(src)#Example9_3importcv2image=cv2.imread("imgs/bus.jpg",0)cv2.imshow("Original",image)eq=cv2.equalizeHist(image)cv2.imshow("HistEqu",eq)cv2.waitKey(0)频域转换02OpenCV离散傅里叶变换dst=cv2.dft(src,flags=0),src为灰度图像,flags决定输出形式,用于转换到频域。离散傅里叶逆变换介绍dst=cv2.idft(src,flags=cv2.DFT_INVERSE),将频域图像转换回空域,保持图像原样。离散傅里叶变换和离散傅里叶逆变换离散傅里叶变换和离散傅里叶逆变换下列程序先通过傅里叶变换把灰度图像转换为频域图像,然后通过傅里叶逆变换把频域图像转化为灰度图像,运行结果如图所示可见,经过两次变换图像完好无损importnumpyasnpimportcv2importmatplotlib.pyplotaspltimg=cv2.imread("imgs/tradition",cv2.IMREAD_GRAYSCALE)#图像从空域转换到频域dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)#合并频域幅度和相位fre=20*np.log(cv2.magnitude(dft[:,:,0],dft[:,:,1]))#图像从频域转换到空域iImg=cv2.idft(dft)iImg=cv2.magnitude(iImg[:,:,0],iImg[:,:,1])#显示频域变换前后的图像plt.subplot(131)plt.imshow(img,cmap='gray')plt.title('original')plt.axis('off')plt.subplot(132)plt.imshow(fre,cmap='gray')plt.title('frequency')plt.axis('off')plt.subplot(133)plt.imshow(iImg,cmap='gray')plt.title('inverse')plt.axis('off')plt.show()设置掩膜,中间高频部分被替换为低频,通过傅里叶逆变换返回空域,实现图像平滑,边缘和细节逐渐增多。低通滤波原理程序中的变量g可以调整滤波窗口大小当g分别取20,60,120时,低频部分逐渐增多,低频窗口逐渐增大,图像中的边缘和细节也随之增多importnumpyasnpimportcv2importmatplotlib.pyplotaspltimg=cv2.imread("imgs/tradition.jpg",cv2.IMREAD_GRAYSCALE)#图像从空域转换到频域dft=cv2.dft(np.float32(img),flags=cv2.DFT_COMPLEX_OUTPUT)rows,cols=img.shapeg=20

#20,60,120#低通maskmask=np.ones((rows,cols,2),np.uint8)mask[g:rows-g,g:cols-g]=0#高通mask#mask=np.zeros((rows,cols,2),np.uint8)#mask[g:rows-g,g:cols+g]=1dft=dft*mask#合并频域幅度和相位fre=20*np.log(cv2.magnitude(dft[:,:,0],dft[:,:,1]))#图像从频域转换到空域iImg=cv2.idft(dft)iImg=cv2.magnitude(iImg[:,:,0],iImg[:,:,1])#显示频域变换前后的图像plt.subplot(131)plt.imshow(img,cmap='gray')plt.title('original')plt.axis('off')plt.subplot(132)plt.imshow(fre,cmap='gray')plt.title('frequency')plt.axis('off')plt.subplot(133)plt.imshow(iImg,cmap='gray')plt.title('inverse')plt.axis('off')plt.show()创建高通掩膜,高频部分保留,低频部分被过滤,通过逆变换突出边缘和轮廓,细节随着高频窗口缩小而减少。高通滤波操作当g分别取20,60,120时,高频部分逐渐减少,高频窗口逐渐缩小,提取到的边缘和细节也随之减少检测图像中的特征03通过图像转换,计算像素边缘直线斜率和截距,使用OpenCV的HoughLines函数在极坐标系中投票,检测超过阈值的直线。Hough变换检测直线检测直线lines=cv2.HoughLines(img,rho,theta,th)其中:

img:边缘检测以后的二值图像。

rho:像素距离精度。

theta:角度精度。th:检测阈值,当Hough空间中的投票数大于th,返回结果lines中增加该直线读取图像,转为灰度,Canny检测边缘,HoughLines函数检测直线,绘制得票最多的8条直线。图像处理步骤检测直线importcv2importnumpyasnpimg=cv2.imread('imgs/tradition.jpg')cv2.imshow("img",img)gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)edges=cv2.Canny(gray,50,150)cv2.imshow("canny",edges)cv2.waitKey()lines=cv2.HoughLines(edges,1,np.pi/180,140)print(lines.shape)forlineinlines[:8]:

rho,theta=line[0]

a=np.cos(theta)

b=np.sin(theta)

x0=a*rho

y0=b*rho

x1=int(x0+1000*(-b))

y1=int(y0+1000*(a))

x2=int(x0-1000*(-b))

y2=int(y0-1000*(a))

cv2.line(img,(x1,y1),(x2,y2),(0,0,255),2)cv2.imshow("lines",img)cv2.waitKey()cv2.destroyAllWindows()Hough变换检测圆原理使用cv2.HoughCircles函数,通过灰度图像检测,参数包括方法、累加器分辨率比例和圆心最小间距。检测圆circles=cv2.HoughCircles(image,method,dp,minDist)

image:灰度图像;

method:检测方法,常用cv2.HOUGH_GRADIENT和cv2.HOUGH_GRADIENT_ALT;

dp:累加器分辨率与图像分辨率的比例;

minDist:圆心之间的最小间距;返回结果circles是一个二维列表,保存检测结果。每个元素是一个由圆心坐标和半径组成的圆使用cv2.imshow显示原图和检测到的圆的图像,cv2.waitKey(0)等待用户按键,cv2.destroyAllWindows()关闭所有窗口。展示结果检测圆importnumpyasnpimportcv2img=cv2.imread('imgs/logo.jpg',0)cv2.imshow("img",img)img=cv2.medianBlur(img,5)cimg=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)circles=cv2.HoughCircles(img,cv2.HOUGH_GRADIENT,1,5)circles=np.uint16(np.around(circles))foriincircles[0,0:8]:

#画圆

cv2.circle(img,(i[0],i[1]),i[2],(0,255,0),2)

#标出圆心

cv2.circle(img,(i[0],i[1]),2,(0,0,255),3)cv2.imshow('circles',img)cv2.waitKey(0)cv2.destroyAllWindows()SIFT(尺度不变特征变换)检测图像中的局部特征关键点,128维向量描述图像局部特征,具有尺度、位置、旋转不变性。SIFT算法介绍检测关键点importcv2gray=cv2.imread('imgs/cat.jpg',0)sift=cv2.SIFT_create()#创建SIFT类的对象kp=sift.detect(gray,None)

#检测SIFT特征img=cv2.drawKeypoints(gray,kp,gray)

#标注每个特征点处cv2.imshow("1",img)cv2.waitKey(0)cv2.destroyAllWindows()通过匹配不同图像间的相同SIFT特征点,可判断图像中是否存在同一物体,实现图像配准、目标跟踪等任务特征匹配应用检测关键点图像颜色的量化04RGB图像的像素值占8位,位于0-255之间,共有256个级别的灰度值量化就是通过减少像素值范围,从而减少存储空间例如,如果每个像素值占4位,像素值位于0-15之间,共16个级别的灰度值,存储空间就减少为8位时的1/16如果每个像素值占2位,存储空间就减少到8位时的1/64图像颜色的量化图像颜色的量化量化是通过聚类实现的,聚类是机器学习中非监督学习算法下列代码调用scikit-klearn中的KMeans实现聚类,然后把聚类获得的标签对像素值重新赋值聚类的数量由第三行代码中k的值指定fromsklearn.clusterimportKMeansimportcv2k=4#16842img=cv2.imread('imgs/bird3.jpg')cv2.imshow("image",img)(h,w)=img.shape[:2]#变换图像矩阵外形,便于聚类img=img.reshape((img.shape[

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论