大家好我必须转换此图片:
在此:
在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)创建新像素并设置新的坐标。
错过了什么?
谢谢。
答案 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)
我猜你不必旋转图像。效果不需要这个。