2011-01-21 4 views
1

나는 xy 좌표로 저장된 작은 픽셀 (문자) 집합을 가지고 있습니다. 이제 중간 점을 중심으로 이미지를 회전시키고 싶습니다. 예를 들어 105도입니다.xy 픽셀 좌표를 회전하는 데 도움이되는 기능, 내 기능을 알 수 없음

는 미들 포인트에서 각각의 화소의 거리가 반경

?: 상관이 올바른 방법이다. 그런 다음 파이썬 코드에

new_x = avg_pos_x+(math.cos(math.radians(105))*radius) 
new_y = avg_pos_y-(math.sin(math.radians(105))*radius) 

작동하는 것 같다, 그러나 또 일부 픽셀이 조금 ​​무작위로 나타납니다.

편집 : 각 픽셀을 105도 회전시키는 것을 잊어 버렸습니다. 또한 중점과 픽셀 사이의 각도를 계산하고이를 105도 추가했습니다.

+0

모든 단계를 안내 할 수 없기 때문에 답변에 넣지는 않겠지 만 픽셀을 이미지 객체에 쓸 수 있다면 회전을 적용하는 것은 간단합니다. PIL http://www.pythonware.com/library/pil/handbook/image.htm –

+1

문제를 보여주는 "이전"및 "이후"이미지를 게시 할 수 있습니까? 당신이 볼 수있는 _ 문제는 _ 픽셀의 개별 그리드를 회전시킨 다음 그 회전 된 그리드의 픽셀을 "일반"그리드로 매핑하기 때문입니다. 화면의 그리드 축). –

답변

0

. 문제는 정확성에 있습니다. 가운데 근처의 픽셀이 움푹 들어가고 멀리 떨어진 픽셀이 펼쳐집니다.

해야 할 일은 픽셀을 보간하여 부드럽게 보이게하는 것입니다.

예를 들어 픽셀을 회전하면 한 픽셀과 다른 픽셀 사이의 중간에 위치하지만 실제로는 반으로, 다른 반쪽에는 문제가있을 때 문제가됩니다. (그것이 의미가있는 경우).

화면에 개별 픽셀이 있기 때문에 원래 픽셀이 새 픽셀에 얼마나 많이 기여하는지 판단해야합니다.

계산 된 좌표의 소수 부분을 보면됩니다. new_x가 정수라고 가정하면 픽셀에 모두 기여하는 것입니다. 하지만 부분적인 부분이 0.25라고합니다. 즉, 픽셀의 약 25 %가 실제로 다음 위치에 있음을 의미합니다. (픽셀 원점을 정의하는 방법에 따라 다름)

2D를 다루는 것이 8 가지 픽셀을 가지고 있기 때문에 더 복잡합니다. 다르게 작동하는 알고리즘이 있으며 더 빨리 (더 빨리) 작동하지만이 방법이 효과적입니다.

+0

감사합니다. 필자는 PIL의 rotate 함수를 사용할 것이라고 생각합니다. – Aron

1

원본 이미지의 각 픽셀이 어디로 이동하는지 파악하는 대신 새 이미지의 각 픽셀이 어디서 왔는지 파악해야합니다. 너는 부정 105도를 돌려서 이것을 할 수있다.

old_x = avg_pos_x+(math.cos(math.radians(-105))*radius) 
old_y = avg_pos_y-(math.sin(math.radians(-105))*radius) 

그런 다음 (old_x, old_y)의 색상을 (x, y)로 복사하십시오. 원하는 경우 보간을 할 수있는 곳입니다 (예 : (old_x, old_y)를 포함하는 정사각형을 중심으로하는 네 개의 픽셀의 가중 평균 색상을 취합니다.

변환을 역으로 수행하면 새 이미지의 각 픽셀에 대한 색상을 정확히 한 번 파악할 수 있습니다. "앞으로"이동하면 새 이미지의 일부 픽셀이 두 번 이상 히트되고 일부는 전혀 히트되지 않습니다. 전혀 히트되지 않는 이러한 픽셀은 "임의"픽셀 일 수 있습니다. 최종 이미지의 기본 색상은 기본 색상 또는 그와 비슷한 수입니다.

관련 문제