Edited at

Poisson Image Editing - シームレスなコラ画像 / Ruby-OpenCV版

数日前にシームレスなコラ画像を作るプログラムをC++ / OpenCVで作りました。

Poisson Image Editing - ポアソン合成フィルター - / C++ OpenCV

今回は、ruby-opencvで作ってみました。


Poisson Image Editing とは

(前回書いたので省略)


プログラム

require "opencv"

include OpenCV

img1 = CvMat.load "eichi.png", 1 # 栄一
img2 = CvMat.load "yukichi.png", -1 # 諭吉

8.times do
img1.rows.times do |i|
img1.cols.times do |j|
if img2[i, j][3] == 255 then
img1[i, j] = CvScalar.new(
((img1[i-1, j][0] + img1[i, j+1][0] + img1[i+1, j][0] + img1[i-1, j-1][0] - img2[i-1, j][0] - img2[i, j+1][0] - img2[i+1, j][0] - img2[i-1, j-1][0]) / 4 + img2[i, j][0]),
((img1[i-1, j][1] + img1[i, j+1][1] + img1[i+1, j][1] + img1[i-1, j-1][1] - img2[i-1, j][1] - img2[i, j+1][1] - img2[i+1, j][1] - img2[i-1, j-1][1]) / 4 + img2[i, j][1]),
((img1[i-1, j][2] + img1[i, j+1][2] + img1[i+1, j][2] + img1[i-1, j-1][2] - img2[i-1, j][2] - img2[i, j+1][2] - img2[i+1, j][2] - img2[i-1, j-1][2]) / 4 + img2[i, j][2]))
end
end
end
end

img1.save_image "eichi_yukichi.bmp"

前回は実行しやすいようにしていてコードが多かったですが、今回は最小限にして20行程度で書くことができました。


比較

ruby-opencvのほうがC++に比べるとやや時間がかかります。


C++ / OpenCV

real    0m0.076s

user 0m0.097s
sys 0m0.074s


Ruby / ruby-opencv

real    0m1.222s

user 0m1.186s
sys 0m0.038s

つぎに画像の比較です。

C++
Ruby




C++のほうが自然な気がする…これはちょっと残念。