出現回数でソートされたカラーカウント


14

これは説明するのが簡単で、これは以前はゴルフではなかったとは信じられませんでした。

特定の画像(言語でサポートされている形式)に対して、一意の色を見つけて、色のリストを出力します。

  • カラーコードを16進数のRGBで印刷します。これは、ハッシュ記号の#後にRに2桁、Gに2桁、Bに2桁が続きます(#xxxxxxxは0〜9、AFおよびafのいずれかです)。
  • 16進コードの後に​​は、スペースと10進数のピクセルカウント、改行(\nまたは\r\n)が続きます。
  • リストは、カウントの降順(最上部の最も頻繁な色)でソートされます。
  • 同点の場合(同量の2色)、順序は重要ではありません。
  • 画像には透明度が含まれないため、アルファ値は重要ではありません。アルファ値は出力の一部ではない場合があります。
  • 4000x3000の画像サイズをサポートする必要があります(タイプ定義に関係する場合があります)

サンプル画像「10red 20blue 30black 40white」: サンプル画像1

期待される出力:

#FFFFFF 40
#000000 30
#0000FF 20
#FF0000 10

サンプル画像「青のグラデーション」: サンプル画像2

期待される出力の1つ(同じ色の順序は異なる場合があるため):

#718DFF 19
#5571FF 15
#3855FF 11
#8DAAFF 11
#1C38FF 7
#AAAAFF 7
#8D8DFF 6
#AAC6FF 6
#C6C6FF 5
#C6E2FF 4
#001CFF 3
#E2E2FF 3
#FFFFFF 3

@Luis Mendoからご提供いただいたサンプル画像「testImage」:

サンプル画像3

期待される出力:

#FFFFFF 18042
#000000 1754
#FF3300 204

この質問に似ていますが、出力は画像ではなくテキストです。


count descending少し不明瞭です。どのようにソートしますか?
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ:降順:最も頻繁に使用される色
トーマスウェラー

さて、もう少し明確にする必要があると思います。たぶん何かのように言うthe most frequent colors at the top
Rɪᴋᴇʀ

@EᴀsᴛᴇʀʟʏIʀᴋ:私は同意します、両方の質問を更新しました
トーマスウェラー

1
いくつかのテストケースが良いでしょう。
マーティン・エンダー

回答:


4

Mathematica、91バイト

StringRiffle@SortBy[Tally["#"<>IntegerString[#,16,2]&/@Join@@#~ImageData~"Byte"],-Last@#&]&

@DavidCのanswerとはまったく異なる方法を使用します。それとは異なり、これは任意のサイズと色数の画像をサポートできます。説明:

#~ImageData~"Byte"                   Take the RGB values of the image...
Join@@(...)                          Flatten to a list of colors...
"#"<>IntegerString[#,16,2]&/@(...)   Convert each color to #012def format...
Tally[(...)]                         Convert to a list of {color, multiplicity}
                                      pairs (this does most of the work)...
SortBy[(...),-Last@#&]               Order by the multiplicity descending...
StringRiffle@(...)                   And create a string with the desired format.

いいね 「Byte」が画像データを返す方法が気に入っています。
DavidC

4

Bash + coreutils、54

  • @manatworkのおかげで7バイト節約
grep -oE '#\w+'|sort|uniq -c|sort -nr|awk '$0=$2" "$1'

これは、Imagemagickの.txt形式の STDIN入力を前提としています。

イデオネ。


上記の入力形式が大きすぎる場合は、Imagemagick変換を任意の形式から追加できます。

Bash + coreutils + Imagemagick、71

convert $1 txt:-|grep -oE '#\w+'|sort|uniq -c|sort -nr|awk '$0=$2" "$1'

ここでは、入力イメージのファイル名がコマンドラインパラメーターとして渡されます。


2
awkのデフォルトOFSはスペースです,
。`

1
またはさらに短いawk部分:awk '$0=$2" "$1'
マナトワーク

3

JavaScript(ES6)、359 355バイト

@Neilのおかげで4バイト節約

u=>{i=new Image;i.src=u;e=document.createElement`canvas`;c=e.getContext`2d`;i.onload=_=>{w=e.width=i.width;h=e.height=i.height;c.drawImage(i,0,0);d=c.getImageData(0,0,w,h).data;for(o={},i=0;i<d.length;i+=4)++o[s='#'+`00000${(d[i]<<16|d[i+1]<<8|d[i+2]).toString(16)} `.slice(-7)]?0:o[s]=1;Object.keys(o).sort((a,b)=>o[b]-o[a]).map(c=>console.log(c+o[c]))}}

デモ

f=u=>{i=new Image;i.crossOrigin='';i.src=u;e=document.createElement`canvas`;c=e.getContext`2d`;i.onload=_=>{w=e.width=i.width;h=e.height=i.height;c.drawImage(i,0,0);d=c.getImageData(0,0,w,h).data;for(o={},i=0;i<d.length;i+=4)++o[s='#'+`00000${(d[i]<<16|d[i+1]<<8|d[i+2]).toString(16)} `.slice(-7)]?0:o[s]=1;Object.keys(o).sort((a,b)=>o[b]-o[a]).map(c=>console.log(c+o[c]))}}
f('http://i.imgur.com/acPudA9.gif')
<input value="https://i.imgur.com/acPudA9.gif" onchange="console.log('-------');f(this.value)">

CORSをサポートするためにimgurにアップロードした他のテストケース:

これら2つの特定のカラーデータは、何らかの理由でアップロードするときにわずかに変化したように見えますが、これらの2つのテストケースで同じ量のオカレンスを印刷します。


|優先順位は<<それよりも低いと思うのですが、代わりに使用する+場合、それほど多くは必要ありません()
ニール

@ user2428118次回は、コメントに懸念事項を残してくれて、自分で答えを編集するのではなく、自分で答えを編集するように頼まれたら感謝しています。実際に<!-- language: lang-js -->スニペットから削除してデモを壊し、JavaScriptを事実上無効にしました。
パトリックロバーツ

@Patrick申し訳ありませんが、次回はもっと慎重になります。また、いくつかのバイトを保存する方法を見つけました:u=>{document.write`<img src=${u} id=i><canvas id=e>`;c=e.getContext`2d`;i.onload=_=>{w=e.width=i.width;h=e.height=i.height;c.drawImage(i,0,0);d=c.getImageData(0,0,w,h).data;for(o={},i=0;i<d.length;i+=4)++o[s='#'+`00000${(d[i]<<16|d[i+1]<<8|d[i+2]).toString(16)} `.slice(-7)]?0:o[s]=1;Object.keys(o).sort((a,b)=>o[b]-o[a]).map(c=>console.log(c+o[c]))}}
user2428118

2

Pyth、29バイト

jmj;_d_SrSm+\#.[\06.Hid256'Q8

オンラインでお試しください!

(オンラインインタープリターは画像を読み取ることができないため、その部分を取り除き、その画像の読み取り結果を入力しました。これは、カラートリプレットのリストです。画像の読み取りを担当する部分は'、単一のコロンです。)

'単一のコロンの機能の証明


画像はトリプレットのリストのリストとして表されるため、sbefore が必要'Qです。
寂部

これが正しい(そしてより短い)ソリューションですV_SrS%L+\#*3"%02X"s'z8jd_N
ジャクベ

2

Mathematica 103 92バイト

{"#"<>IntegerString[255Round[List@@#],16,2],#2}&@@@DominantColors[#,9999,{"Color","Count"}]&

写真


説明

DominantColors通常、画像内の主要なクラスターを表す色とカウントのリストを返します。要求された色の数が画像の色の数を超えると、正確なピクセル色が返されます。(入力画像に含まれる色は1万色未満であると想定しています。)

画像


{"#"<>IntegerString[255Round[List@@#],16,2],#2} 10進数の色の値を16進値に変換します。


注:マンドリル画像には5色しかありません。(ColorQuantize[<image>,5]標準マンドリル画像の色数を減らすために使用していました。)


ちょうどあなたをゴルフアウト;)
LegionMammal978

少しだけ。しかし、あなたのアプローチは無制限の数の色を取ります。
DavidC

1

PowerShell v2 +、187バイト

$a=New-Object System.Drawing.Bitmap $args[0]
$b=@{}
0..($a.Height-1)|%{$h=$_;0..($a.Width-1)|%{$b["#"+-join($a.GetPixel($_,$h).Name[2..7])]++}}
$b.GetEnumerator()|Sort value -des|FT -h -a

「最も支配的な色を取得」に関する私の答えからのコードのほとんどすべてを再利用します。それで、完全な説明のためにそれを参照してください。

ここでの変更はインデックス作成にあります $b我々は、明示的な出力形式の要件に合わせて、3行目の、そして最後の行にsortvalue-des、その後、順番をcendingへのパイプFormat-Tableを持つ-HideTableHeadersや-AパラメータなどutoSize。FT出力は実行の終了時に暗黙的であるため、PPCGで実際にここで使用することは非常にまれですが、ここでは正しいパーツの出力のみを取得することが非常に便利です。

1つ目はドミナントカラーチャレンジの「赤」のテストイメージ、2つ目はこのチャレンジの「テストイメージ」です。

PS C:\Tools\Scripts\golfing> .\color-count.ps1 C:\Tools\Scripts\golfing\img\red.png

#ff0000 139876
#dcd9cf 3056  
#f2f1ed 1512  
#ffffff 1508  
#ffe6e6 1488  
#ffe3e3 8     
#eae8e2 4     
#fffbfb 4     


PS C:\Tools\Scripts\golfing> .\color-count.ps1 C:\Tools\Scripts\golfing\img\z07VA.gif

#ffffff 18042
#000000 1754 
#ff3300 204  

1

Tcl / Tk、134バイト

console s
lmap s [concat {*}[[image c photo -fi $argv] d]] {dict inc D $s}
dict fo k\ v [lsort -int -s 2 -inde 1 -de $D] {puts $k\ $v}

d以下のためですdata

Tcl / Tk、232バイト

console s
set I [image c photo -fi $argv]
set i 0
time {set j 0
time {dict inc D #[join [lmap s [$I g $i $j] {format %02X $s}] ""]
incr j} [image h $I]
incr i} [image w $I]
dict fo k\ v [lsort -int -s 2 -inde 1 -de $D] {puts $k\ $v}

wish sort_pix.tcl QTE4O.png

ここに画像の説明を入力してください


wish sort_pix.tcl 5s1Ob.png

ここに画像の説明を入力してください


wish sort_pix.tcl z07VA.gif

ここに画像の説明を入力してください


1

Brain-Flak、1110バイト

{{}({}[(()()()()()){}])}{}(<>)<>([]){{}({}()<({}()<({}()<>)>)>)<>([])}{}<>{({}<({}<({}<(()()<>)>)>)>)<>{(<>)<>(()()()){({}[()]<<>({}<([([(({})<>[({})]<>)])]<>)<>{({}()<([{}])<>({}<>)<>>)<>}{}<>{}<>>{})({}<({}<({}<>)<>({}<>)<>({}<>)<>>)<>({}<>)<>({}<>)<>({}<>)>)<>({}<({}<>)<>({}<>)<>>)<>({}<>)<>({}<>)>)}{}<>((){[()](<{}>)}{})((){[()](<{}({}())<>{}{}{}>)}{}){{}(<<>(()()()){({}[()]<({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}<>>)}{}>)}{}<>({}<({}<>)<>({}<>)<>({}<>)<>>)<>({}<>)<>({}<>)<>({}<>)<>}({}<(([])<{{}({}<>)<>([])}{}<>>)<>>)<>{({}[()]<({}<>)<>>)}{}(()()()()){((({}[()])<{({}[()]<({}<({}<>)<>>)>)}{}>)<{({}[()]<<>({}<>)>)}{}>)}{}<>}{}<>(()()()())([][()])({}(<>))<>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>){({}[()]<(<(()()()())([][()])({}(<>))><>([()]{()<(({})){({}[()])<>}{}>}{}<><{}{}>)<{({}[()]<([([({}<({}<({}<({}<(({})<>)<>>)>)>)>)<><({}<>)>]{}<(())>)](<>)){({}())<>}{}({}<><{}{}>){{}<>(<({}<({}<({}<({}<({}<({}<({}<({}<>)>)>)>)<>>)>)>)>)<>({}<({}<({}<({}<<>>)>)>)>)>)}{}({}<({}<({}<({}<>)>)>)>)<>>)}{}<>{}{}{}{}>[()]){({}[()]<({}<({}<({}<({}<>)>)>)>)<>>)}{}<>>)}{}{({}[()]<>)<>}<>

オンラインでお試しください!

それは冒険でした。結局のところ、Brain-Flakは画像処理があまり得意ではありません。誰かわかったね?

まず、要求された厳密な出力形式を技術的に満たしていないことに注意することから始めます。強制する場合はお知らせください。翻訳コードを追加してみます。現時点では、10進数を出力します。各4つの数字は、赤緑青カウントの順に色を表します。

次に入力します。許可された入力形式はより柔軟だったので、Brain-Flakが解析するのに最も簡単な形式(見つけた)を使用しました:Netpbm P6。残念ながら、Brain-FlakはP3形式の10進数を解析できませんでした。これは、すべてのNetpbmイメージが文字で始まりP、Brain-Flakが数字以外の文字を含むファイルからの10進入力を処理できないためです。そのため、P6は色情報をバイトとして保存し、ASCII入力モードでは数字として扱われるため、代わりにP6が使用されました。ヘッダー情報はないため、課題が残りました有効にエンコードさが、幸いなことに、私はその情報を必要としないため、破棄されます。このプログラムは、ヘッダー内の改行を許可しないため、Netpbm標準に完全には準拠していませんが、改行は許可されていません入力は有効なNetpbmファイルであるため、標準で必要です。

最後の注意点として、TIOのバージョンは実際には「公式」操作用に正しく構成されていません。これは、TIOの入力としてファイルを提供できず、直接入力で印刷できないASCIIに対応するバイトを提供できないためです 公式の操作では、-a未加工のバイトとして-f入力を取得し、ファイルから入力を取得するためにフラグが必要です。TIOリンクのサンプル入力は、代わりにNetpbm wikiページの例から手動で翻訳されました。

さらに、役に立つコードの抜粋を提供してくれたBrain-Flak wikiに感謝します。特に、ここでのBubble-Sortの実装は、他のどこから始めればいいのかまったくわからなかったので、すべての色を数えると最終ステップに役立ちました。大幅な修正が必要でしたが、ゼロから始める必要がなかったのは嬉しいです。

これは、コードの未使用およびコメント付きのバージョンです。Brain-Flakは少し冗長すぎて、この投稿に便利な形式の説明を含めることはできませんが、TIOの無料版には、ここで管理できるよりも優れた形式の1つに含まれるすべてのものが含まれています。見て。

まだゴルフができていないかもしれませんが、私の以前の Brain-Flakの回答は多くの修正を経ましたが、そこで学んだ教訓がより良い出発点になることを願っています。


0

Python 2、186バイト

import Image
I=Image.open(input()).convert('RGB')
w,h=I.size
r=['#'+('%0.2X'*3)%I.getpixel((i%w,i/h))for i in range(w*h)]
for a,b in sorted(set((r.count(v),v)for v in r))[::-1]:print b,a

オンラインでお試しください!

免責事項:提示された出力は、読みやすさのためのワンライナーです。コード出力は、チャレンジで要求されたスペースと行の分離を伴います。

10赤20青30黒40白の出力:

[('#FFFFFF', 40), ('#000000', 30), ('#0000FF', 20), ('#FF0000', 10)]

青のグラデーションの出力:

[('#718DFF', 19), ('#5571FF', 15), ('#8DAAFF', 11), ('#3855FF', 11), ('#AAAAFF', 7), ('#1C38FF', 7), ('#AAC6FF', 6), ('#8D8DFF', 6), ('#C6C6FF', 5), ('#C6E2FF', 4), ('#FFFFFF', 3), ('#E2E2FF', 3), ('#001CFF', 3)]

テスト画像の出力

[('#FFFFFF', 18042), ('#000000', 1754), ('#FF3300', 204)]

説明:

w,h=I.size # field size stores tuple of values of width and height of image

I.getpixel((i%w,i/h)) # returns tuple of base10 RGB values

('%0.2X'*3) # format string to convert int into hex

set((r.count(v),v)for v in r) # generate set of unique pairs count-color 

sorted(set(...))[::-1] # apply sorted(), as it sorts set of tuples by firts elements and reverse sort

print b,a  # swap values in tuples and print

0

Java(1.4+)483 428バイト

import java.util.*;class I {public static void main(String[] a) throws Exception {java.awt.image.BufferedImage i = javax.imageio.ImageIO.read(new java.io.File(a[0]));Map m=new HashMap();String s;for(Integer x=0,y=0,c;y<i.getHeight();y++)for(x=0;x<i.getWidth();m.put(s=x.toHexString(((c=i.getRGB(x++,y))&0xff0000)>>16)+x.toHexString((c & 0xff00)>>8)+x.toHexString(c&0xff),m.get(s)==null?1:(int)m.get(s)+1));System.out.print(m);}}

オンラインでお試しください!(オンラインでは動作しません)


ゴルフをしていない:

import java.util.*;

class I {
    public static void main(String[] a) throws Exception {
        java.awt.image.BufferedImage i = javax.imageio.ImageIO
                .read(new java.io.File(a[0]));
        Map m = new HashMap();
        String s;
        for (Integer x = 0, y = 0, c; y < i.getHeight(); y++)
            for (x = 0; x < i.getWidth(); m
                    .put(s = x.toHexString(((c = i.getRGB(x++, y)) & 0xff0000) >> 16)
                            + x.toHexString((c & 0xff00) >> 8)
                            + x.toHexString(c & 0xff), m.get(s) == null ? 1
                            : (int) m.get(s) + 1))
                ;
        System.out.print(m);
    }
}

次のtoString()ようなマップ出力の:

{7c7c7c=6, 1d57a5=20468, 121212=7, d3d3d3=3, bdbdbd=9, 949494=2, 333=14, 626262=3, cacaca=2, 141414=5, fff=11, c9c9c9=1, e8e8e8=1, 919191=4, 161616=5, c2c2c2=1, 646464=7, 979797=12, fafafa=2, 808080=1, 7b7b7b=1, 484848=4, b9b9b9=2, f1f1f1=2, 6b6b6b=6, 363636=15, 262626=4, d8d8d8=2, 868686=4, 757575=1, 575757=3, a7a7a7=2, cecece=2, dcdcdc=2, c3c3c3=2, 1d1d1d=5, 727272=9, 656565=2, 3a3a3a=3, 7d7d7d=10, 393939=5, 797979=3, 222=31, 8f8f8f=2, 454545=4, 181818=9, 2e2e2e=2, 222222=1, 1c1c1c=19, b8b8b8=2, e1e1e1=5, 232323=5, 8a8a8a=3, 959595=7, 6a6a6a=9, 434343=7, 5c5c5c=3, 111=20, 909090=3, 424242=4, 212121=1, 1a1a1a=6, 202020=7, efefef=1, 565656=5, 6e6e6e=7, 767676=3, 323232=2, eee=5, 444=18, 2c62ab=1, 717171=2, b1b1b1=3, 6c6c6c=3, 545454=7, 515151=17, 2f2f2f=2, 4a4a4a=3, 888888=6, 6d6d6d=3, 898989=3, a3a3a3=5, 7e7e7e=9, ddd=9, b6b6b6=3, 2b2b2b=5, 313131=5, 8d8d8d=1, a2a2a2=2, 696969=3, a5a5a5=3, 4f4f4f=5, 828282=7, 191919=5, 606060=4, 6f6f6f=4, 8b8b8b=3, ebebeb=2, 555=19, 929292=3, 131313=11, 999999=5, d2d2d2=2, 444444=9, 474747=4, dddddd=1, 585858=8, 5a5a5a=3, 000=9887, afafaf=2, dfdfdf=3, 747474=3, 666666=4, a1a1a1=4, 2a2a2a=11, 4d4d4d=6, 818181=2, 878787=5, 215aa6=1, d9d9d9=4, b5b5b5=3, b4b4b4=3, 737373=4, aeaeae=3, bbb=15, 242424=4, 2d2d2d=8, 888=19, c1c1c1=1, 494949=9, dbdbdb=5, ccc=19, 5d5d5d=3, 5f5f5f=1, 414141=6, c8c8c8=3, aaa=16, 1e1e1e=3, 707070=2, 9e9e9e=2, 373737=7, 9d9d9d=2, 1b1b1b=4, 303030=7, 535353=10, 595959=2, 8e8e8e=3, 383838=5, 939393=18, 616161=2, 686868=6, dadada=1, e3e3e3=2, 5b5b5b=3, a4a4a4=5, 8c8c8c=5, a6a6a6=11, 292929=6, 4c4c4c=3, 151515=6, fefefe=2, 787878=2, 505050=2, e2e2e2=1, 1f1f1f=9, adadad=2, ababab=1, 5e5e5e=6, 252525=4, 4e4e4e=3, 282828=7, a8a8a8=4, 9c9c9c=3, aaaaaa=1, 101010=5, b7b7b7=2, 969696=6, 7f7f7f=4, 555555=2, a9a9a9=5, 343434=8, 999=17, 777777=3, ffffff=76669, f0f0f0=4, bbbbbb=1, 1e58a5=1, b3b3b3=4, 777=20, 636363=2, d4d4d4=1, 2c2c2c=5, 848484=1, 3c3c3c=3, bfbfbf=2, 3e3e3e=9, 333333=4, 7a7a7a=3, 858585=4, 4b4b4b=3, 272727=7, 111111=6, 666=13, 9b9b9b=1, bcbcbc=4, cfcfcf=2, 9a9a9a=1, 404040=21, 525252=3, 989898=4, 171717=5, 3b3b3b=2, c4c4c4=1, 3f3f3f=7, 464646=1, cdcdcd=2, b2b2b2=33, c5c5c5=2, bababa=2}

古いJavaで動作しない限り、1.8の特定のゴルフの提案を投稿しないでください。

例:ラムダは、動作するよりも多くのバージョンのJavaで動作しません。


古いJavaで動作しない限り、1.8の特定のゴルフの提案を投稿しないでください。私は望んでいません。
ケビンクルーッセン

Javaの4で作業する必要がありますいくつかのgolfs(と思う): import java.util.*;class M{public static void main(String[]a)throws Exception{java.awt.image.BufferedImage i=javax.imageio.ImageIO.read(new java.io.File(a[0]));Map m=new HashMap();String s;for(Integer x=0,y=0,c;y<i.getHeight();y++)for(x=0;x<i.getWidth();m.put(s=x.toHexString((c&0xff0000)>>16)+x.toHexString((c&0xff00)>>8)+x.toHexString(c&0xff),m.get(s)==null?1:(int)m.get(s)+1))c=i.getRGB(x++,y);System.out.print(m);}}419バイト
ケビンCruijssen

@KevinCruijssen 1.8は、おそらく、以前のバージョンでは実行されないコードに関しては最大のリリースだったからです。他のほとんどのリリースは、JREへのクラスの修正と追加でした。1.8は、以前のJREとの互換性が最も低くなりました。
魔法のタコ

@KevinCruijssen x.toHexIntegerは、静的インポートよりもスマートでした。
魔法のタコ

また、Javaのない3、Javaの3理由は...本当に...ので、いくつかのショートカットがあります...
マジックタコ壺

0

SmileBASIC、165バイト

DEF C A
L=LEN(A)DIM C[L],N[L]FOR J=0TO L-1FOR I=0TO U-1ON A[J]-C[I]GOTO@L
NEXT
U=U+1@L
C[I]=A[J]INC N[I]NEXT
RSORT.,U,N,C
FOR I=0TO U-1?"#";HEX$(C[I],6),N[I]NEXT
END

画像は32ビットARGBカラー値の配列として提供されます(数値が6桁の16進文字列に変換されると、アルファ値がトリミングされます)

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