이 이미지 축소 알고리즘의 행 단위 버전을 구현하려고합니다 : http://intel.ly/1avllXm, RGBA 8 비트 이미지에 적용했습니다.ARM NEON을 사용하여 이미지 크기 조정
단순화하기 위해 단일 행 w_src -> w_dst의 크기를 조정하는 것을 고려하십시오. 그런 다음 각 픽셀은 가중치 1.0의 단일 출력 누적기에 값을 제공하거나 가중치 알파 및 (1.0f - 알파)가있는 두 개의 연속 출력 픽셀에 기여할 수 있습니다. C/의사 코드 :
float acc[w_dst] = malloc(w_dst * 4);
x_dst = 0
for x = 0 .. w_src:
if x is a pivot column:
acc[x_dst] += (w_src[x] * alpha);
x_dst++;
acc[x_dst] += (w_src[x] * (1.0f - alpha);
else
acc[x_dst] += w_src[x];
는 마지막으로 기여 소스의 화소 수 (플로트 브로)에 의해 각 축 전체 채널 분할 :
uint8_t dst = malloc(w_dst);
for x_dst = 0 .. w_dst
dst[x_dst] = (uint8_t)round(acc[x_dst]/area);
내 기준 순수한 C 구현 올바르게 작동한다. 그러나 NEON 연산을 사용하여 작업 속도를 높이는 방법이 있는지 궁금해했습니다. 각 픽셀은 8 비트 RGBA입니다. 감사!
예, 명확성을 위해 의사 코드를 단순화했습니다. 모든 분명한 최적화 (분할 대신 곱셈, 부동 계산 캐싱)를 수행했지만 여전히 SIMDable 접근 방식이 있는지 알고 싶었습니다. 계산의 정확도가이 알고리즘의 결과에 큰 영향을 미치지 만, 고정 소수점 산술을 살펴볼 것입니다. – avish
많은 사람들의 일반적인 오해 중 하나는 fp가 float보다 덜 정확하다는 것입니다. Float은 24 비트 정밀도를 제공하지만 충분할 수도 있지만 값이 커질수록 최하위 비트가 잘립니다.반면에 fp의 정밀도는 동일하게 유지되고 마지막에서 int로 변환 될 때까지 잘리지 않습니다. 귀하의 경우 q14 fp 산술조차도 현재 구현보다 정확합니다. –
... 아아아, 물론 당신 말이 맞아요. 소스 행이 충분할 때 정밀도가 손실되어 정확한 누적 정밀도에 비해 누적 기 값이 너무 큰 현재 float 구현의 버그를 발견했습니다. – avish