[英]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 中的效果一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.