您的位置:首页 > 运维架构

在OpenCV里实现极坐标变换4

2019-09-02 08:35 4738 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/caimouse/article/details/100191034

前面使用自己定义插值算法来实现极坐标变换,现在来使用OpenCV里面函数来实现极坐标变换,主要有两个函数:线性极坐标函数linearPolar和对数极坐标函数logPolar。这两个函数分别定义如下:

dst = cv.linearPolar(src, center, maxRadius, flags[, dst])

其中参数src表示输入图像数组;

参数center表示极坐标的变换中心;

参数maxRadius表示中心到边界最大的半径;

参数flags表示插值算法的标志。

 

dst=cv.logPolar(src, center, M, flags[, dst])

其参数src表示输入图像数组;

参数center表示极坐标的变换中心;

参数M是尺度缩放系数,M决定输出图像x轴(\rho)的尺度;

参数flags表示不同的变换。

对数极坐标(logpolar)是仿真生物视网膜中央凹陷的特性,具有数据压缩的能力,可用于目标跟踪中快速尺度和旋转变换不变的模板匹配。对数极坐标其实就是将图像像素坐标转换成极坐标,然后对r求取对数,获得的坐标。它的变换公式如下:

这两个公式的差别,就是这两个函数的差别。logPolar函数变换也实现了聚焦效果,或者中心点采样高,边界采样低,实现一种圆形滤波的效果。下面这个例子演示了线性极坐标变换、对数极坐标变换,以及对数极坐标反变换:

[code]#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np

#图片的路径
imgname = "img3.jpg"

#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

#图片的高度和宽度
h,w = image.shape[:2]
print(w,h)
#极坐标变换的中心
cx,cy = w/2.0,h/2.0
print(cx,cy)
#在中心点画一个圆
cv2.circle(image,(int(cx),int(cy)),10,(255.0,0,0),3)

#线性极坐标变换
out = cv2.linearPolar(image,(cx,cy),cy,cv2.INTER_LINEAR)
print(out.shape)

#对数极坐标变换
outlog = cv2.logPolar(image, (cx,cy), 50, cv2.WARP_FILL_OUTLIERS)

#对数极坐标反变换
rlog = cv2.logPolar(outlog, (cx,cy), 50, cv2.WARP_INVERSE_MAP)

#显示原图和输出图像
cv2.imshow("Image",image)
cv2.imshow("out",out)
cv2.imshow("outlog", outlog)
cv2.imshow("rlog", rlog)

cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下:

输入图片

线性极坐标变换输出图片

对数极坐标变换输出

对数极坐标反变换输出

 

从前面的结果来看,经过极坐标变换之后,再转回原图,离圆心越远的像素丢失越大,这样也可以作为图像压缩的一种,也可以作为仿生学的一种方式,还可以从方图转换圆图的一种方式。

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: