2012-12-10 3 views
6

색맹 인 사람의 이미지를 루비로 수정하기위한 알고리즘을 구현/변환하려고합니다 (daltonize).ruby-vips를 사용하는 첫 번째 단계

javascriptpython + 익숙하지 않은 언어/환경의 다른 구현으로 작성된 두 가지 기본 참조 구현이 있습니다.

VIPS/ruby-vips는 물론 이미지 처리 경험이 거의 없습니다. 나는 첫 단계를 만드는 방법을 궁금해. 설명서는 주로 C/C++로 보이고 루비면에서는 거의 보이지 않습니다. 또한 매우 상세합니다. 심지어 어떤 기본 작업을 잘 모르겠어요. lin 기능이 좋은 출발점 인 것처럼 보이지만 정확하게 적용하는 방법을 모르겠습니다.

일부 VIPS 경험이있는 사람이라면 몇 분 안에 전체 알고리즘을 사용할 수 있습니다. 아무도 내가 어디서부터 시작해야할지 알려주는지 궁금해. 구체적으로 :

  • 단일 (R/G/B) 요소에 액세스하는 방법은 무엇입니까?
  • daltonize 구현에 기반한 더 나은 접근법이 있습니까?

답변

6

저는 루비 - vips 관리자입니다.

이 여기에 상당히 완전한 루비 문서입니다 : http://rubydoc.info/gems/ruby-vips/0.3.0/frames

이 문서는 주로 보석 (0.3.5)의 현재 버전에서 누락 어떤 이유로,하지만 0.3.0에 존재, 난 안했습니다 이유를 해결할 수있었습니다. 0.3.0에서 0.3.5 사이의 변경 사항은 대부분 버그 수정으로 0.3.0 문서가 사용하기에 좋습니다.

대부분의 이미지 처리 라이브러리와 마찬가지로, 당신은 루비 - 바이어스가있는 단일 픽셀에 액세스하지 않습니다 (또는 매우 드물게). Ruby는 너무 느려서 실용적이지 않습니다. 대신에 루비 -vips가 제공하는 벡터 연산을 연결합니다. 예 :

#!/usr/bin/ruby 

require 'rubygems' 
require 'vips' 

a = VIPS::Image.jpeg(ARGV[0]) 

b = a.lin(1.1, 0) 

b.write(ARGV[1]) 

x.lin(a, b) 방법은 이미지 x를 가져 와서 선형 변환을 적용합니다. 각 픽셀에 a을 곱한 다음 b을 추가 한 새로운 이미지를 반환합니다 (http://rubydoc.info/gems/ruby-vips/0.3.0/VIPS/Image#lin-instance_method 참조). 이 같은이 프로그램을 실행하면 : 그것은 이미지 k2.jpg를로드

$ ./try.rb k2.jpg x.jpg 

를 1.1로 모든 픽셀을 곱 (. 즉, 그것은 10 % 밝게), 및 x.jpg에 저장합니다.

참고로 중심선을 변경할 수는 세 가지 동작을 수행 할

지금
b = a.pow(1/2.4).lin(1.1, 0).pow(2.4) 

: 그것은 (입력 화상의 감마가 2.4이라고 가정) 이미지를 선형화 것이다 스케일 밝기 후 다시 적용 감마. 내부적으로, vips는이 세 가지 연산을 한 번에 계산하여 사용 가능한 프로세서에 적용합니다.우리가 수행하는 작업이없는 회전 간단한 픽셀 단위로 계산하기 때문에

마지막으로 (이 이미지를 선형화하는 가장 좋은 방법이 아니다, 난 그냥 체인을 보여주기 위해 노력하고있어) 또는 이미지를 스트리밍 할 수 있으므로 미리로드 할 필요가 없습니다. 당신은 할로드 작업을 변경할 수 있습니다

a = VIPS::Image.jpeg(ARGV[0], :sequential => true) 

이제 루비 VIP를 컴퓨터를 통해 이미지를 스트리밍 및 메모리에 전체 이미지를로드 할 수 없습니다. 따라서 메모리 제한을 두지 않고도 모든 크기의 이미지를 처리 ​​할 수 ​​있습니다. 위키가 루비의 VIP :

여기 이민자를위한 완전한 Daltonize 예

#!/usr/bin/ruby 

# daltonize an image with ruby-vips 
# based on 
# http://scien.stanford.edu/pages/labsite/2005/psych221/projects/05/ofidaner/colorblindness_project.htm 

require 'rubygems' 
require 'vips' 

im = VIPS::Image.new(ARGV[0]) 

# remove any alpha channel before processing 
alpha = nil 
if im.bands == 4 
    alpha = im.extract_band(3) 
    im = im.extract_band(0, 3) 
end 

begin 
    # import to CIELAB with lcms 
    # if there's no profile there, we'll fall back to the thing below 
    lab = im.icc_import_embedded(:relative) 
    xyz = lab.lab_to_xyz() 
rescue VIPS::Error 
    # nope .. use the built-in converter instead 
    xyz = im.srgb_to_xyz() 
end 

# and now to bradford cone space (a variant of LMS) 
brad = xyz.recomb([[0.8951, 0.2664, -0.1614], 
        [-0.7502, 1.7135, 0.0367], 
        [0.0389, -0.0685, 1.0296]]) 

# through the Deuteranope matrix 
# we need rows to sum to 1 in Bradford space --- the matrix in the original 
# Python code sums to 1.742 
deut = brad.recomb([[1, 0, 0], 
        [0.7, 0, 0.3], 
        [0, 0, 1]]) 

# back to xyz (this is the inverse of the brad matrix above) 
xyz = deut.recomb([[0.987, -0.147, 0.16], 
        [0.432, 0.5184, 0.0493], 
        [-0.0085, 0.04, 0.968]]) 

# .. and back to sRGB 
rgb = xyz.xyz_to_srgb() 

# so this is the colour error 
err = im - rgb 

# add the error back to other channels to make a compensated image 
im = im + err.recomb([[0, 0, 0], 
         [0.7, 1, 0], 
         [0.7, 0, 1]]) 

# reattach any alpha we saved above 
if alpha 
    im = im.bandjoin(alpha.clip2fmt(im.band_fmt)) 
end 

im.write(ARGV[1]) 
+1

와우. 정말 고마워. 그것은 js/python 알고리즘을 변환하려고 할 때 너무 바보 같은 시간을 보낸다. 나는 이것에 경험이있는 누군가가 이것을 해결하기 위해 단지 몇 분이 걸릴 것임을 알았다. 나는 이것이 어떻게 작동 하는지를 알 수 있도록 노력할 것이고 그래서 나는 그 과정에서 조금 배울 수있을 것이다. 나는 +1000을 할 수 있었으면 좋겠다. 감사! – gingerlime

+0

@ YoavAner, 다음도 참조하십시오. http://stackoverflow.com/questions/10709995/ruby-vips-image-processing-library-are-there-any-good-examples-of-usage –

+0

감사합니다. @Stanislaw - 내가 그랬어. 당신의 질문을 이미 보아라. 그러나 daltonize 전환으로 어떤 진보를하는 방법에 관해서 아직도 매우 잃어버린 감각이었다. 필자는 제안 된 구현을 아직 시도하지 않았지만 곧 다시 시도 할 것입니다. – gingerlime

1

의 '예'과의 '기본 개념'페이지와 https://github.com/jcupitt/ruby-vips/wiki. 그들은 루비 - 바이어스 사용법의 기초를 보여줍니다.

@YoavAner처럼 자신의 유스 케이스를 자유롭게 추가 할 수 있습니다 (예 : Daltonize).

관련 문제