画像の「監視」


9

問題:

この挑戦は私が抱えていた本当の問題から来ています。職場でデュアルモニターをセットアップしていて、壁紙として次の画像を使用したいと考えています。

理想的なイメージ

しかし、私のモニターにはかなり重要なベゼルがあり、背景を設定すると、次のようになり、桟橋が表示されます(appiers?)。

発行画像

以下の画像のように、中央を切り取った画像を作成し、元のサイズに戻すことでこれを解決できました。

チャレンジ画像


チャレンジ:

画像を取り込み、デュアルモニターセットアップで使用するために "監視"するプログラムを作成します(つまり、画像の中央部分を削除します(ベゼルがある場所))。ルールは次のとおりです。

  1. パス(文字列引数など)として、またはファイル選択ダイアログの形式で画像を受け入れる完全なプログラムである必要があります。
  2. プログラムは、画像の中心から切り取るための垂直線の数(幅が1ピクセル)を入力として受け取る必要があります。
  3. トリミングは元の画像の中央(幅方向)から行う必要があります
  4. 結果の画像は、入力画像の元のサイズに再スケーリングする必要があります。(半分を個別にスケーリングしてから連結したり、連結してからスケーリングしたりできます。個別にスケーリングすると、より良いイメージ/効果が得られますが、現実の世界ではほとんど目立ちません)
  5. 背景画像は一般的に均一であるため、この課題を簡単にするために、入力画像のピクセル数は偶数になり、削除する線の数も均一になります。
  6. この挑戦はコードゴルフです-バイトで最短のコードが勝ちます

幸運を!


2
1.同じ幅にスケーリングされているため、写真から操作が何であるかがはっきりしません。おそらく、最初と最後の画像を、真ん中の画像と同じサイズで白が埋め込まれた画像に置き換えますか?2.任意の形式の再スケーリングを使用できますか(線形がおそらく最も安価です)、または特定の形式(例:3次、sincなど)である必要がありますか?
Peter Taylor

@PeterTaylorルール3に従って、入力画像と出力画像は同じ幅であると想定されています。各半分が元の幅の半分にサイズ変更されてから連結されるか、または切り取られた半分が連結されてから元のサイズにスケーリングされます。はい、スケーリングは問題ありません。
dberm22

「たぶん」で始まる文は、質問を理解しやすくするための提案であり、課題の解釈の提案ではありませんでした。自分で変更しました。
Peter Taylor

@PeterTaylorああ、なるほど。ありがとう。
dberm22

画像が横向きになると想定できますか?
スコットミルナー

回答:


1

オクターブ、85バイト

@(f,n)imsave(imresize((o=imread(f))(:,[1:(end-n)/2,(end+n)/2:end],:),size(o)(1:2)),f)

fファイル名nと削除する列の数を使って無名関数を定義します。無名関数は単一の式を必要とするため、MATLABにはない機能であるインライン割り当てが使用されます。

MATLAB、98バイト

おまけとして、MATLABと互換性のある答えも取り入れました。興味深いことに、Octaveバージョンはインライン割り当てを正しく解析するために多くの括弧を必要とするため、これはわずか13バイト長くなります。

function  m(f,n)
o=imread(f);imsave(imresize(o(:,[1:(end-n)/2,(end+n)/2:end],:),size(o(:,:,1))),f)

5

Matlab 2013、150バイト

これがMatlabでの私の試みです。間違いなく最短のコードではありませんが、それは始まりです。

警告、これは元の画像を上書きするため、最初にコピーを作成してください。

ゴルフバージョン

function  mi(f,n)
o=imread(f);
s=size(o);
imwrite([imresize(o(:,1:((s(2)-n)/2),:),[s(1),s(2)/2]) imresize(o(:,((s(2)+n)/2):end,:),[s(1),s(2)/2])], f);
end

奇妙な画像サイズと奇数の列の改善を備えた、ゴルフではないコード

function  monitorizeImage( filename, num_columns )

orig = imread(filename);
orig_size = size(orig);

f = factor(orig_size(2));
origsize_iseven = f(1)==2;

f = factor(num_columns);
num_columns_iseven = f(1)==2;

odd_even_size_mismatch = xor(origsize_iseven,num_columns_iseven);

img_resized = imresize(orig,[orig_size(1) orig_size(2)+odd_even_size_mismatch]);

leftimg = img_resized(:,1:((orig_size(2)+odd_even_size_mismatch-num_columns)/2),:);
leftimg = imresize(leftimg,[orig_size(1),floor(orig_size(2)/2)]);
rightimg = img_resized(:,((orig_size(2)-odd_even_size_mismatch+num_columns)/2):end,:);
rightimg = imresize(rightimg,[orig_size(1),floor(orig_size(2)/2)]);

monitorized_image = [leftimg rightimg];
monitorized_image = imresize(monitorized_image,[orig_size(1),orig_size(2)+ ~origsize_iseven]);

[~, ~, ext] = fileparts(filename); 

imwrite(monitorized_image,strcat(filename(1:end-length(ext)),'_',num2str(num_columns),ext));

end

これに追加するだけです。課題への答えは、与えられたスコアリング基準を最適化するための真剣な試みを行わなければなりません。では、コードゴルフこのような挑戦、その手段は、コードの長さを減らすことが、明らかな改善がなされなければならないということ。

未使用のスペースと空白を削除してみてください。
dkudriavtsev 2017

@ ais523ありがとう。220バイトまで!
dberm22

また、2バイトの変数はすべて1つ多すぎます。読みやすさは重要ではないのでos、アルファベットの他の文字にリファクタリングするなどしてください!そしてf、全体を保存するために、入力画像に画像を書き戻すだけではstrcatどうですか。(ちなみに、これで['',...]はなく、で置き換えることができますstrcat(...)
Sanchises

@Sanchisesありがとう、それはゴルフされていない/改良されたバージョンからの残り物でした。ルールには、上書きできない、またはきれいな名前の出力が必要であると記載されていませんでした。おかげで、バイト数が70バイト減少しました!
dberm22

3

タングステン言語、134127119の 111バイト

f[i_,c_]:=(d=ImageDimensions@i;ImageAssemble[ImageTake[i,a=All,#]&/@{{0,e=-#&@@d/2-c/2},{-e,a}}]~ImageResize~d)

f(MathematicaまたはWolfram Cloudのシンボルとして)最初の入力として画像を取り、2番目の入力として整数を受け取る関数を作成します。

Ungolfed

f[image_,columns_]:=(  (*Define Function*)
    d=ImageDimensions[image];  (*Get image dimensions*)
    e=d[[1]]/2+columns/2;  (*Add half the image width to half the number of removed columns*)
    ImageResize[ImageAssemble[Map[ImageTake[i,All,#]&,{{0,-e},{e,All}}]],d]  (*Map the function onto a list with the desired column ranges and merge and scale the resulting image*)
)

技術的には、いずれかの画像のサイズが362,880ピクセルを超えると正しく機能しませんが、問題の範囲外(および一部のコンピューター)であるため、問題ないと思います。修繕!


2

PHP、206バイト

($c=imagecopyresized)($t=imagecreatetruecolor($w=imagesx($s=imagecreatefrompng($argv[1])),$h=imagesy($s)),$s,0,0,0,0,$v=$w/2,$h,$x=$v-$argv[2]/2,$h);$c($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);imagepng($t,$argv[3]);

3つのコマンドライン引数を取ります。ソースファイル名、トリミングする行数、およびターゲットファイル名です。で実行し-rます。

より良い結果を得るためimagecopyresampledに、imagecopyresized(+ 2バイト)の代わりに使用したい場合があります。

ない

$s=imagecreatefrompng($argv[1]);    # load source image
$w=imagesx($s);$h=imagesy($s);      # get image dimensions
$t=imagecreatetruecolor($w,$h);     # create target image
$v=$w/2;                            # $v = half width
$x=$v-$argv[2]/2;                   # $x = width of remaining halves
                                    # resize and copy halves:
imagecopyresized($t,$s, 0,0,    0,0,$v,$h,$x,$h);
imagecopyresized($t,$s,$v,0,$w-$x,0,$v,$h,$x,$h);
imagepng($t,$argv[3]);              # save target image

PNGの結果をSTDOUTに送信することで、さらに9バイトを節約できますが、どうしてですか?


「PNGの結果をSTDOUTに送信することで、さらに9バイトを節約できますが、何のためですか?」次にphp -r image.php image.png 1 > output.png、のようなものを実行することができますよね?
ʰᵈˑ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.