【问题标题】:[Java-Opencv]: How convert an image from Cartesian space to Polar space?[Java-Opencv]:如何将图像从笛卡尔空间转换为极坐标空间?
【发布时间】:2014-07-09 06:31:21
【问题描述】:

大家好,我必须转换这张图片:

在这个:

在 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) 获取坐标 (rho,theta) 处的颜色像素

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

什么遗漏或错误?

谢谢。

【问题讨论】:

  • 是javacv还是opencv的java api?
  • 笛卡尔坐标如何应用于图像?通过图像的尺寸?你到底想达到什么目的?笛卡尔和极坐标是二维的,图像通常被认为是多维的,那又如何?
  • “笛卡尔坐标如何应用于图像”是什么意思?我用过: Mat original_img = Highgui.imread(file.getAbsolutePath());通过文件读取图像
  • 顺便说一句,Core.cartToPolar

标签: java image opencv processing


【解决方案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));

这对我来说看起来不错。但是你为什么要转换成极坐标呢?

附:上面的代码当然和Opencv有关。

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

虽然我不能告诉你旋转部分,但从你的声明get color pixel at coords (rho,theta) 我猜你不必旋转图像。效果不需要这个。

【讨论】:

  • 嗨!感谢您的回复,我需要转换图像以在我的大学进行考试。我正在按照论文的说明进行项目:(我使用 int 而不是 double 因为方法 .setRGB (int, int, int) 需要 3 个 int。但是我使用的方法是正确的?图像需要旋转和之后翻译?
  • 在论文中有一个rho和theta的公式。其中 rho 表示距中心 (Cx,Cy) 的径向距离,theta 表示角度。这就是我使用这个公式的原因。
  • 我的错误,我没有注意到你的代码开头。我认为是正确的。我会更正我的代码。
猜你喜欢
  • 2016-04-14
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 2013-08-05
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多