2012-04-29 3 views
4

그래서 "간단한"색 감소를 이미지에 적용하기 시작했습니다. 나는 마지막 날에 어떻게 작동하는지 연구했고, 여기서 실험 할 수있는 알맞은 알고리즘으로 보이는 것을 찾았다. Median cut algorithm중간 색 적용 감소 알고리즘의 출력 팔레트를 원본 이미지에 적용

출력은 n 색 팔레트이다. 나는이 알고리즘이 실제로 작동하는지 아직 확신하지 못했다. 그러나 나는 그것이 있다고 가정하고있다. 내가하고 싶은 것은 그 출력물을 가져 와서 팔레트가 생성 된 이미지에 적용하는 것입니다.

나는 이미지에 관해서 내가 컬러 압축 포맷과 모든 깊은 지식에 정통하다고 말할 수는 없지만, 오는 이미지 포맷으로 시작하지 않고 어떻게 팔레트를 적용 할 수 있는지 궁금하다. 인덱싱 된 팔레트 (즉, GIF).

저는 각 픽셀에 대해 현재 픽셀의 색상과 팔레트의 각 색상의 차이를 계산하고 그 픽셀을 가장 적은 차이의 팔레트 색상으로 대체한다고 생각합니다. 이것이 접근 할 수있는 실행 가능한 방법일까요?

주 - 다양한 라이브러리 (ImageMagick)를 살펴 보았지만 약간 과장된 것으로 보입니다. 이미지 조작으로 할 수있는 대부분이 컬러 팔레트를 줄이는 것입니다. 이보다 더 복잡한 것은 없습니다. 그래서이 알고리즘을 구현하는 것이 내 요구에 가장 간단한 방법이라고 생각합니다.

+0

그냥 참고로 어떤 동료 Qt는 사용자를위한 -이 알고리즘은 Qt는에 완벽하게 통합하고 잘 작동합니다. 작동 시키려면 제로 변경이 필요합니다. – giraffee

+0

Median Cut을 사용하여 게임을하고 싶다면 https://github.com/pornel/improved-pngquant/ (빠른 매핑과 PNG 지원이 있습니다) – Kornel

답변

1

나는 그것이 가능한 방법이라고 생각합니다. 당신이 계산 한 차이는 유클리드의 차이가되어야합니다. here 그러나 약간의 최적화를 할 수 있습니다. 매번 새로운 차이를 계산할 필요는 없습니다. 예를 들어 이미 계산 한 경우 올바른 색상을 직접 사용하기 위해 조회 테이블을 채울 수 있습니다.

+0

굉장 - 위키에서 독서. 그리고 룩업 테이블을 제안 해 주셔서 감사합니다. – giraffee

2

가장 빠른 방법은 색상 검색을 위해 octree 트리를 사용하는 것입니다.

팔레트 색상 색인을 oct 트리에 추가 한 다음 루트 노드에 가장 가까운 색상을 요청하는 것이 좋습니다. 가장 가까운 색을 묻는 메시지가 표시되면 각 노드 (팔레트에 액세스 할 수 있음)는 자신의 색 색인이 가장 깊은 수준에있는 경우 해당 색 색인을 반환하거나 해당 자식 (요청 된 색)에 가장 가까운 색 색인을 요청합니다. 대응하는 아이가없는 경우는, 모든 아이에게 가장 가까운 색 인덱스를 요구해, 색이 최소의 색 인덱스를 돌려줍니다.

기본적으로 oct 트리는 수행해야하는 거리 비교의 수를 최소화합니다. 이것은 모든 거리를 미리 계산하여 빨라집니다.

여기 내 구현의

... http://www.codeproject.com/Tips/1046574/OctTree-Based-Nearest-Color-Search