2011-05-14 4 views
1

한 번 이미지가 알파 투명도로 흰색 배경과 검은 색 배경 위에 겹쳐졌습니다. 원본 이미지가 아닌 결과 이미지 두 개에 액세스 할 수 있으며 원본을 검색하고 싶습니다.ImageMagick을 사용하여 두 개의 합성 이미지에서 원래의 마스크를 검색하십시오.

나는 Ruby 코드를 작성했는데, Ruby에있는 것만 큼 빠르다고 생각합니다.

if pixel_on_black == pixel_on_white 
    # Matching pixels indicate 100% opacity in the original. 
    original_pixel = pixel_on_black 
elsif color_on_black == BLACK && color_on_white == WHITE 
    # Black on black and white on white indicate 0% opacity in the original. 
    original_pixel = TRANSPARENT 
else 
    # Since it's not one of the simple cases, then we'll do some math. 
    # Fancy algebra tells us the following. (MAX_VALUE is the largest value 
    # a channel can have. So, in most cases, 255.) 

    # First, find the alpha value. This equation follows from the equations 
    # for composing on black and composing on white. 
    alpha = pixel_on_black.red - pixel_on_white.red + MAX_VALUE 

    # Now that we know the alpha value, undo its multiplicative effect on the 
    # pixel on black. By dividing. Ta da. 
    alpha_ratio = alpha/MAX_VALUE 
    original_pixel = Pixel.new 
    original_pixel.red = pixel_on_black.red /alpha_ratio 
    original_pixel.green = pixel_on_black.green/alpha_ratio 
    original_pixel.blue = pixel_on_black.blue/alpha_ratio 
    original_pixel.alpha = alpha 
end 

는 그래서 좋은이고, 그것은 작동하고 모든 : 여기에 픽셀로 기본 로직, 반복하는 픽셀입니다. 그러나이 코드는 매우 빠르게 실행되어야하며 Ruby에서 픽셀 반복은 허용되지 않습니다. 이 함수가 이미 어딘가에 존재하지 않는다면 트릭을 수행 할 일련의 ImageMagick 옵션을 생각해내는 것이 가장 좋습니다.

ImageMagick의 명령 줄 도구가 정말 강력하게 보이므로 -fx 또는 멋진 -function 인수가 위의 코드와 같은 역할을하기 때문에 ImageMagick의 명령 줄 도구를 지금 연구 중입니다. 나는 계속 노력할 것이지만 이미 모든 것을 함께 모으는 방법을 알고있는 ImageMagick 전문가가 있습니까?

편집

:가 나는 -fx 버전 지금 실행 :

convert image_on_black.png image_on_white.png -matte -channel alpha -fx "u.r + 1 - v.r" -channel RGB -fx "(u.a == 0) ? 1 : (u/u.a)" output.png 

원래 코드의 거의 정확한 번역, 채널로 깨진있다. 알파 채널을 반복하고 정확한 알파 값을 설정하십시오. 그런 다음 RGB 채널을 반복하고 채널을 알파 값으로 나눕니다 (0이 아닌 경우 0으로 나누면 오류가 발생하므로이 값을 1로 설정합니다.이 경우 1을 흰색으로 선택했습니다).

-fx 표현식이 각 픽셀에 대해 재평가되기 때문에이를 더 명시적인 인수로 변환해야합니다.

답변

0

Mkay, 나는 여기에 자신을 놀라게했고, 나는 대답을 찾았다 고 생각한다. 비록 ImageMagick이 4 개의 ImageMagick 명령을 가지고 있지만 어쩌면 하나의 이미지로 처리 될 수 있습니다.

convert input_on_white.png -channel RGB -negate /tmp/convert_negative.png && \ 
convert input_on_black.png /tmp/convert_negative.png -alpha Off -compose Plus -composite /tmp/convert_alpha.png && \ 
composite plasma2.png /tmp/convert_alpha.png -alpha Off -channel RGB -compose Divide /tmp/convert_division.png && \ 
convert /tmp/convert_division.png /tmp/convert_alpha.png -compose CopyOpacity -composite plasma_output.png 

(완료되면 분명히, 이러한 임시 파일을 청소합니다. 또한, 오히려 하드 코딩 된 경로를 사용하는 것보다, 실제 임시 파일 시스템을 사용합니다.)

전략 먼저를 나타내는 그레이 스케일 이미지를 생성하는 것입니다 알파 마스크. alpha = pixel_on_black.red - pixel_on_white.red + MAX_VALUE 코드 행을 에뮬레이트 할 것이며 alpha = pixel_on_black.red + (MAX_VALUE - pixel_on_white.red)으로 다시 쓸 수 있습니다.

그래서 1 행 : 우리는 그 공식의 두 번째 항을 나타내는 이미지를 생성합니다.이 이미지는 이미지 온백 (white-on-white) RGB 채널의 부정 버전입니다. 임시 파일로 저장합니다.

다음 줄 2 : 이미지에 검정색 이미지를 추가하고 싶습니다. ImageMagick의 Plus 구성을 사용하여 임시 알파 마스크로 저장하십시오. 결과는 흰색이 최종 이미지에서 100 % 불투명해야하는 영역을 나타내는 회색 음영 이미지이고 검정색은 나중에 완전히 투명 해지는 영역을 나타냅니다.

다음 줄 3 : 흑백 이미지를 원래 RGB 색상으로 되돌립니다. 블랙 온 이미지는 RGB 채널에 알파 비율을 곱하여 만들어 졌기 때문에 알파 마스크 이미지로 나누어 그 효과를 취소합니다.

마지막으로 4 행 : ImageMagick의 CopyOpacity 합성 기능을 사용하여 3 행의 색상 보정 이미지를 가져 와서 2 행의 알파 마스크를 적용합니다. 따!

내 원래 전략은 5-10 초 정도 걸렸습니다. 이 전략은 1 초도 채 걸리지 않습니다. 훨씬, 훨씬 더.

놀랍게도 도움을 요청하는 것이 내가 직접 해답을 찾도록 유도 한 것입니다. 어쨌든, 나는이 질문을 48 시간 동안 열어 두어 누군가가 좀 더 최적의 해결책을 찾았는지 알아볼 것입니다. 감사!

관련 문제