簡體   English   中英

如何使用 `cv2.warpPolar` 在笛卡爾坐標系和極坐標系之間正確轉換圖像?

[英]How to properly convert image between Cartesian and polar coordinate systems using `cv2.warpPolar`?

如何使用cv2.warpPolar方法將圖像從笛卡爾坐標系轉換為極坐標系並返回,而不裁剪視圖因此丟失細節?

我觀察到,對於不是完美正方形的圖像,在生成的極坐標系中,平行於 x 軸的線將變為圓形而不是橢圓,因此圖像的相當大塊將不在視野范圍內,因此信息丟失。

我希望圓圈成為與原始圖像具有相同縱橫比的橢圓,以便所有轉換后的圖像都被壓縮到視圖中並且不會丟失任何信息。

例如,這會生成一個測試圖像:

import numpy as np
import cv2

img = np.zeros(shape=(1080, 1920, 3), dtype=np.uint8)
img[:, :, 0] = np.linspace(0, 255, 1920, dtype=np.uint8)[np.newaxis, :]
img[:, :, 2] = np.linspace(0, 255, 1080, dtype=np.uint8)[:, np.newaxis]
img[0:180, 0:320, 1] = 255
img[900:1080, 0:320, 1] = 255
img[900:1080, 1600:1920, 1] = 255
img[0:180, 1600:1920, 1] = 255
cv2.imshow('test image', img); cv2.waitKey(0)
cv2.imwrite('D:/test_image.jpg', img)

在此處輸入圖像描述

這會將測試圖像扭曲到極坐標:

r = (1920*1920+1080*1080)**.5/2
polar = cv2.warpPolar(img, dsize=(1920, 1080), center=(960, 540), maxRadius=r, flags=cv2.WARP_INVERSE_MAP)
cv2.imshow('polar image', polar); cv2.waitKey(0)
cv2.imwrite('D:/polar_test_image.jpg', polar)

在此處輸入圖像描述

這將其扭曲回笛卡爾:

linear = cv2.warpPolar(polar, dsize=(1920, 1080), center=(960, 540), maxRadius=r, flags=cv2.WARP_POLAR_LINEAR)
cv2.imshow('cartesian image', linear); cv2.waitKey(0)
cv2.imwrite('D:/cartesian_test_image.jpg', linear)

在此處輸入圖像描述

但我想要的是這樣的:

在此處輸入圖像描述

上面的圖像是使用 PhotoShop CS6 轉換的。

並被 PhotoShop CS6 扭曲:

在此處輸入圖像描述

如何生成與 PhotoShop 相同的結果?


我以為我很清楚,但你沒有明白。

我希望扭曲的圖像不是一個完美的正方形,它應該具有與輸入圖像完全相同的分辨率和縱橫比。

並且不應該有多余的黑色部分。 就像在 PhotoShop 中的效果一樣。

您“想要”的圖片可以通過將輸入旋轉 90 度輕松實現。 你想要中間的綠色和青色方塊嗎? 然后逆時針旋轉 90 度,這樣它們就在左側,在翹曲之前。 然后他們會在中心。

您必須確保給定半徑的圓適合您在dsize中指定的尺寸。

使用dsize=(2*r,2*r)並相應地居中。

要么,要么您必須使用不同的半徑值。

適當的論據

並再次扭曲回來

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM