画像のすべてのピクセルを出現回数でソートする


8

入力

選択したラスターグラフィック形式のファイルの名前。選択したフォーマットは、チャネルごとに少なくとも8ビットと3チャネルをサポートする必要があります。

出力

最初のファイルと同じサイズで同じサイズの同じ形式のファイル。ただし、ピクセルは発生回数の降順でグループ化され、左から右、上から下にソートされます。

  • ピクセルの特定の色が同じ回数表示される場合、それらの順序は指定されていません。
  • 入力ファイルを上書きしないでください(出力には別のファイル名を使用してください)。
  • すべてのサードパーティの画像処理ライブラリが許可されています。

パンダ

次のような出力が得られます。

パンダ画像から並べ替えられたピクセル

特に、画像の下部では、同じ周波数の色の間でタイが異なるため、いくつかの変動が発生する可能性があります。


1
出力にPNMなどの他のファイル形式を使用できますか?
FUZxxl 2015年

@EMBLEM「forego grayscale」の意味がわかりません。
FUZxxl 2015年

@MartinBüttner良い点は、入力と出力が同じフォーマットになるように変更したことです。
エンブレム2015年

1
@EMBLEM彼は「2つのピクセルが同じ頻度で発生する」のように「絆」を意味したと思います。この場合、それらの順序が指定されていないと想定できますか?
FUZxxl 2015年

1
入力/出力を明確にするために...文字列(ファイル名)、バイトのストリーム、または複雑なFileタイプのオブジェクトを使用できますか?それはいくつかの言語で大きな違いを生むでしょう。
Geobits 2015年

回答:


4

J、94 81バイト

PNGファイルの名前(透明度チャネルなし)を取り、その結果を「o」で始まる入力ファイル名に書き込む関数。

f=.3 :0
load'graphics/png'
(($a)$#/|:\:~(#,{.)/.~,a=.readpng y)writepng'o',y
)

入力 出力

方法

  • すべての色番号とその出現数のリストを作成します
  • 出現回数でリストを並べ替え
  • 見た目と等しいすべての色番号を乗算します
  • 新しいリストを元の画像の形状に再形成します

関数をダイアディックにし、ソートされたPNGをに保存すると、1文字を保存できますx
FUZxxl 2015年

@FUZxxl実際には3文字節約されますが、仕様に沿っているとは思いません。また、画像を1文字の拡張子のないファイルに保存することもできますが、あまりエレガントではありません。
randomra

@FUZxxlさて、関数の本体にかなりの余分な文字があることが
わかりました

Jは話せませんが、仕様では文字列が入力されています。ここでは、入力ファイル名がプログラムにハードコーディングされています。
edc65 2015年

@ edc65 Jでは、関数を定義すると、その引数は常にy文字によってアクセスされます。(2つの引数を使用して関数を定義した場合、それらはによってアクセスされxyそれ以上の引数を使用して関数を定義することはできません。)
randomra

6

Mathematicaの、125の 123バイト

Export["a"<>#,i=ImageData@Import@#;Image@ArrayReshape[Join@@ConstantArray@@@SortBy[Tally[Join@@i],-Last@#&],Dimensions@i]]&

これは、名前のない関数を定義します。この関数は、任意の一般的な画像形式のファイル名を受け取り、結果を同じ名前で先頭にを付けてファイルに書き込みますa。MathematicaのSortByブレークはデフォルトのソート順でタイを分割するため、結果はOPとは少し異なって見えます。したがって、タイのロードが発生する下部のビットは少しきれいに見えます:

パンダではありません。

実装自体は非常に簡単です。

  • ImageData カラー値のグリッドを取得します。
  • Join 配列を平坦化します。
  • Tally 各色の出現を数える。
  • SortBy[...,-Last@#&] 頻度の高い順に並べ替えます。
  • ConstantArrayそしてJoin再び集計を展開します。
  • ArrayReshape(で取得したDimensions)元の画像の形状を復元します。
  • Image データを画像オブジェクトに変換します。

参考までに、ファイルI / Oには22バイトが使用されます。画像オブジェクトを受け取って返す同等のバージョンは103バイトです。

(i=ImageData@#;Image@ArrayReshape[Join@@ConstantArray@@@SortBy[Tally[Join@@i],-Last@#&],Dimensions@i])&

4

Python2 / PIL、 244 226 225 223 222 202 186 182 170 159

from PIL.Image import*
s=raw_input();i=open(s);g=list(i.getdata());i.putdata(sum([[c[1]]*-c[0]for c in sorted((-g.count(r),r)for r in set(g))],[]));i.save(2*s)

変更ログ

stokasticによる短いバージョン、123

from PIL.Image import*
s=raw_input();i=open(s);d=list(i.getdata());i.putdata(sorted(d,key=lambda D:d.count(D)));i.save(2*s)

まあ、それはすでに打たれていますが、少なくとも試してみましょう。

それは非常に遅いです、私のラップトップでパンダは数分間処理しました。

元のファイル名を2回繰り返したファイル名で保存します。

パンダ


を使用すると32バイトを節約できますがi=open(raw_input());d=list(i.getdata());i.putdata(sorted(d,key=lambda D:d.count(D)));i.save('o.png')、大きな画像の場合は非常に遅くなります(各ピクセルでlist.countを呼び出します)。
2015年

@stokasticまあ、私はそれを追加しますが、それをあなたに信用します。変数ではなく名前を読み取ることを好みます(ユーザーが画像という名前を入力した場合はどうなりますo.pngか)
PurkkaKoodari 2015年

けっこうだ!:)
確率論的2015年

2

Python、1197バイト

# -*- coding: utf-8 -*-
from __future__ import division
from collections import Counter
import png
from sys import argv,exit
script,file_name,output_file_name=argv
def group(s,n):
    return zip(*[iter(s)]*n)
def flatten(list_of_lists):
    result=[]
    for lst in list_of_lists:
        result.extend(lst)
    return result
def group_list(old_list,tuples_per_list):
    new_list=[]
    i=1
    appended_row=[]
    for item in old_list:
        appended_row.extend(flatten([item]))
        if i==tuples_per_list:
            new_list.append(appended_row)
            i=1
            appended_row=[]
        else:
            i+=1
    return new_list
input_image=png.Reader(file_name)
image_data=input_image.read()
width=image_data[0]
height=image_data[1]
pixels=list(image_data[2])
if image_data[3]["alpha"]:
    ints_per_colour=4
elif image_data[3]["greyscale"]:
    ints_per_colour=2
else:
    ints_per_colour=3
colours=Counter(colour for row in pixels for colour in group(row,ints_per_colour)).most_common()
pixel_list=flatten([element]*count for element,count in colours)
ordered_rows=group_list(pixel_list,width)
f=open(output_file_name,"wb")
png_object=png.Writer(width,height,greyscale=image_data[3]["greyscale"],alpha=image_data[3]["alpha"])
png_object.write(f,ordered_rows)
f.close()

pngモジュール私が使用しました


2
リファレンスソリューションを提供していただきありがとうございます。私たちは通常、これらをチャレンジ投稿自体に入れて、人々がより簡単に見つけられるようにしますが、回答として投稿することもできます。
FUZxxl 2015年

1

C#413

完全なプログラム。コマンドラインでファイル名を渡すと、出力はファイル「o」と同じ形式で保存されます。

SelectManyやEnumerable.Rangeなど、linqのいくつかの優れた機能を使用しない。

using System.Collections.Generic;using System.Linq;using System.Drawing;
class P{
static void Main(string[]a){
var d=new Dictionary<Color,int>();var b=new Bitmap(a[0]);
int n,x,y,w=b.Width,h=b.Height;
for (x=w;x-->0;)for(y=h;y-->0;){var p=b.GetPixel(x,y);d[p]=d.ContainsKey(p)?d[p]+1:1;}
y=h;foreach(var q in d.OrderBy(v=>v.Value)){for(n=q.Value;n-->0;){
if(x<=0){x=w;--y;}b.SetPixel(--x, y, q.Key);}}b.Save("o");
}}

読み取り可能 VS2010の書式設定礼儀

using System.Collections.Generic;
using System.Linq;
using System.Drawing;

class P
{
    static void Main(string[] a)
    {
        var d = new Dictionary<Color, int>();
        var b = new Bitmap(a[0]);
        int n,x,y,w = b.Width, h=b.Height;

        for (x = w; x-- > 0;)    
            for (y = h; y-- > 0;)
            {
                var p = b.GetPixel(x, y);
                d[p] = d.ContainsKey(p) ? d[p]+1 : 1;
            }
        y = h;
        foreach (var q in d.OrderBy(v => v.Value))
        {
            for (n = q.Value; n-- > 0; )
            {
                if (x <= 0)
                {
                    x = w;
                    --y;
                 }
                 b.SetPixel(--x, y, q.Key);
            }
        }
        b.Save(a[0]+".");
    }
}

私は間違っているかもしれませんが、{charsの後の改行を削除できます
sergiol

そして前に } charsの
sergiol

私のようなものquess tio.run/##VY/Ba8IwGMX/...が働くだろう!
sergiol

1

Python 2:191バイト

これが私の試みです。を使用してスペースを節約できると考えましたCounterが、Pietu1998の回答ほど小さくはありませんでした。

from collections import Counter
from PIL import Image
i=Image.open(raw_input())
s=reduce(lambda x,y:x+y,map(lambda(a,b):[a]*b,Counter(i.getdata()).most_common()))
i.putdata(s)
i.save("o.png")

パンダからの出力

パンダからの出力

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.