python - 比较python中的opencv lineartoPolar()转换
问题描述
我的目标是将二维功率谱(下图)从笛卡尔坐标转换为极坐标。
imshow(np.log10(psd2shift),cmap=cm.jet)
stackoverflow 上有几篇关于如何做到这一点的帖子,例如这个链接。所以我相信我的代码是正确的。
ro,col=psd2shift.shape
cent=(int(ro/2),int(col/2))
max_radius = int(np.sqrt(ro**2+col**2)/2)
polar=cv.linearPolar(np.log10(psd2shift),cent,max_radius,cv.WARP_FILL_OUTLIERS)
plt.imshow(polar,cmap=cm.jet, interpolation='bicubic')
显然,尽管在 linearPolar 函数或此处的文档的帮助下进行了深入研究,但我无法发现转换中的差异。似乎中心的定义不正确,但我很确定它是。想法?
带help(cv.linearPolar)
返回:关于内置函数 linearPolar 的帮助:
linearPolar(...)
linearPolar(src, center, maxRadius, flags[, dst]) -> dst
. @brief Remaps an image to polar coordinates space.
.
. @anchor polar_remaps_reference_image
. ![Polar remaps reference](pics/polar_remap_doc.png)
.
. Transform the source image using the following transformation:
. \f[\begin{array}{l}
. dst( \rho , \phi ) = src(x,y) \\
. dst.size() \leftarrow src.size()
. \end{array}\f]
.
. where
. \f[\begin{array}{l}
. I = (dx,dy) = (x - center.x,y - center.y) \\
. \rho = Kx \cdot \texttt{magnitude} (I) ,\\
. \phi = Ky \cdot \texttt{angle} (I)_{0..360 deg}
. \end{array}\f]
.
. and
. \f[\begin{array}{l}
. Kx = src.cols / maxRadius \\
. Ky = src.rows / 360
. \end{array}\f]
.
.
. @param src Source image
. @param dst Destination image. It will have same size and type as src.
. @param center The transformation center;
. @param maxRadius The radius of the bounding circle to transform. It determines the inverse magnitude scale parameter too.
. @param flags A combination of interpolation methods, see cv::InterpolationFlags
.
. @note
. - The function can not operate in-place.
. - To calculate magnitude and angle in degrees @ref cv::cartToPolar is used internally thus angles are measured from 0 to 360 with accuracy about 0.3 degrees.
解决方案
我的第一印象是你可能弄乱了中心的坐标。OpenCV 中的点被称为(x,y)
混淆地翻译为(col, row)
. 交换代码中的那些
ro,col=img.shape
cent=(int(col/2),int(ro/2))
max_radius = int(np.sqrt(ro**2+col**2)/2)
polar=cv2.linearPolar(img,cent,max_radius,cv2.WARP_FILL_OUTLIERS)
plt.figure(figsize=(16,10))
plt.imshow(polar,cmap='jet', interpolation='bicubic')
plt.show()
我得到了图像,我认为它接近你想要的。
推荐阅读
- spring-boot - 由于 org.springframework.boot.context.properties.bind.BindException 运行 springboot 测试时出错
- javascript - NextJS 中每个组件的共享/获取数据
- swiftui - Swiftui Multi Picker 以最小最大值更改选择
- javascript - Quasar PWA Workbox 路由排除
- aws-lambda - 响应卡未显示在 website-lex 中
- prometheus - Prometheus 节点导出器未在 Centos 6 上返回指标
- python - ClientError:调用 ListObjects 操作时发生错误 (AccessDenied):访问被拒绝
- python - 列名前点的目的是什么
- gradlew - 优化 gradle wrapper 的安装大小
- kubernetes - Kubernetes 无法从通过 /etc/hosts 指向私有域的私有注册表中提取映像