我必须水平翻转图像,但是当我输入我的代码时,它只会翻转一半,以便它反映在图像的中间。 我做错了什么?
public static void flipVertical(Pixel[][] imageArr)
{
int height = imageArr.length;
int width = imageArr[0].length;
for(int row = 0; row < height; row++)
{
for(int col = 0; col < width; col++)
{
Pixel p = imageArr[row][col];
imageArr[height - row - 1][col] = p;
}
}
答案 0 :(得分:2)
您的代码目前无法正常工作,因为它将图像的翻转下半部分复制到上半部分而不将原始数据保留在图像的上半部分。因此,当它处理图像的下半部分时,它有效地将相同的数据再次复制回下半部分。
当您交换两个值a
和b
时,您需要使用临时变量:
Pixel tmp = a;
a = b;
b = a;
如果您按照以下方式执行此操作:
a = b; // After, a == b and b == b.
b = a;
然后第二个作业实际上是一个无操作,因为a
的值已经是b
。
因此,您需要将内循环更新为:
Pixel p = imageArr[row][col];
imageArr[row][col] = imageArr[height - row - 1][col];
imageArr[height - row - 1][col] = p;
此外,外部for循环应为:
for(int row = 0; row < height/2; row++)
否则,您可以翻转图像,然后再将其翻转。
答案 1 :(得分:1)
问题在于您需要更改以后仍需要的像素。当row
通过行的上半部分时,您可以通过从上半部分复制它们来修改下半部分中的像素。当row
稍后通过行的下半部分时,您尝试通过从下半部分复制它们来修改上半部分中的像素 - 但算法的前半部分已经改变了下半部分即可。因此,当您设置上半部分时,您不会复制原始像素。
至少有两种方法可以解决这个问题:
(1)不要使用相同的阵列。创建一个新数组来保存结果,并在完成后复制。
(2)让row
最多只能达到高度的一半,对于每次循环迭代,交换 imageArr[row][col]
和imageArr[height-row-1][col]
中的像素,像:
Pixel p1 = imageArr[row][col];
Pixel p2 = imageArr[height-row-1][col];
imageArr[row][col] = p2;
imageArr[height-row-1][col] = p1;
(具体来说,您只想在row < height-row-1
时执行此操作。当您到达row >= height-row-1
时,您必须退出循环。否则您将开始撤消你已经完成的工作。)
答案 2 :(得分:0)
您可以使用AffineTransform类及其方法 def query(a=[1,2,3,4], b=[3,1,1,2,3,4,5,6]):
"""
table A table B Expected Output Actual Output
idx value idx value indxA indxB indxA indxB
0 1 0 3 0 1 0 1
1 2 1 1 0 2 0 1
2 3 2 1 1 3 1 3
3 4 3 2 2 0 2 0
5 4 2 3 2 0
6 5 3 5 3 5
7 6
EXAMPLE
Table A index 0 occurs at Table B index 1 and 2
PROBLEM
Anywhere there are multiple matches only first occurrence prints
"""
for idx, itemA in enumerate(a):
if itemA in b:
for itemB in b:
if itemA == itemB:
print("{} {}".format(a.index(itemA), b.index(itemB)))
query()
水平翻转图像。请参阅代码here:
translate
答案 3 :(得分:0)
水平翻转图像是什么意思?看起来你想要垂直交换它......水平交换(垂直分配)意味着通过垂直(相应的水平)轴镜像它。
反正。两件事:正确交换像素并将循环限制为维度的一半(一旦交换两个像素,就不需要再次交换它们):
public static void flipHorizontal(Pixel[][] imageArr)
{
int height = imageArr.length;
int width = imageArr[0].length;
for(int row = 0; row < height; row++)
{
for(int col = 0; col < width/2; col++)
{ // swap two symmetric pixels
Pixel tmp = imageArr[row][col];
imageArr[row][col] = imageArr[row][width-col-1];
imageArr[row][width-col-1] = tmp;
}
}
}