[Java-Opencv]:如何将图像从笛卡尔空间转换为极坐标空间?

时间:2014-07-09 06:31:22

标签: java image opencv processing

大家好我必须转换此图片:

enter image description here

在此:

enter image description here

在Java中。

这是我的代码:

     double Cx =original_img.width()/2;
     double Cy =original_img.height()/2;
     int rho,theta;

     for (int i=0;i<img.getHeight();i++){
         for(int j=0;j<img.getWidth();j++){


             rho = (int)(Math.sqrt(Math.pow(i-Cx,2) + Math.pow(j-Cy,2)));  
             theta = (int)(Math.atan2((j-Cy),(i-Cx)));

             int color; 

             try{

                color = img.getRGB((int)rho, (int)theta);
             }catch(Exception e){
                color = 0;
             }

             int  alpha = (color>>24) & 0xff;
             int  red = (color & 0x00ff0000) >> 16;
             int  green = (color & 0x0000ff00) >> 8;
             int  blue = color & 0x000000ff;
             int pixel = (alpha << 24) | (red << 16) | (green << 8) | blue;
             img2.setRGB(rho, theta, pixel);


             System.out.println("point: "+rho+" "+theta);
         }
     }

怎么了? 我还没有在java中找到一个简单而好的Log-Polar变换。

我的步骤是:

1)拍摄原始图像(original_img)

2)在图像的行和列上循环

3)计算rho和theta(是新像素的新X和Y坐标,对吗?)

4)在coords(rho,theta)获得彩色像素

5)创建新像素并设置新的坐标。

错过了什么?

谢谢。

1 个答案:

答案 0 :(得分:1)

现在我明白了。您想要应用于像素坐标。抱歉。

 rho = (int)(Math.sqrt(Math.pow(i-Cx,2) + Math.pow(j-Cy,2)));  
 theta = (int)(Math.atan2((j-Cy),(i-Cx)));

为什么您要在上面的代码中使用int代替double?如果不需要,我建议使用double。此外,代码错误,您每次都减去维度。不要这样做:

 rho = Math.sqrt(Math.pow(i,2) + Math.pow(j,2));  
 theta = Math.atan2((j),(i));

这对我来说很好看。但是为什么你想转换成极地?

P.S。上面的代码当然与Opencv有关。

编辑:如果我正确解释算法,笛卡尔坐标应位于图像的中心,所以请使用您的代码:

我无法告诉你关于旋转部分但是从你的陈述中get color pixel at coords (rho,theta)我猜你不必旋转图像。效果不需要这个。