저는 루비 - 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])
와우. 정말 고마워. 그것은 js/python 알고리즘을 변환하려고 할 때 너무 바보 같은 시간을 보낸다. 나는 이것에 경험이있는 누군가가 이것을 해결하기 위해 단지 몇 분이 걸릴 것임을 알았다. 나는 이것이 어떻게 작동 하는지를 알 수 있도록 노력할 것이고 그래서 나는 그 과정에서 조금 배울 수있을 것이다. 나는 +1000을 할 수 있었으면 좋겠다. 감사! – gingerlime
@ YoavAner, 다음도 참조하십시오. http://stackoverflow.com/questions/10709995/ruby-vips-image-processing-library-are-there-any-good-examples-of-usage –
감사합니다. @Stanislaw - 내가 그랬어. 당신의 질문을 이미 보아라. 그러나 daltonize 전환으로 어떤 진보를하는 방법에 관해서 아직도 매우 잃어버린 감각이었다. 필자는 제안 된 구현을 아직 시도하지 않았지만 곧 다시 시도 할 것입니다. – gingerlime