Twitter画像エンコードチャレンジ[終了]


597

1000語に相当する画像の場合、140文字でどのくらいの画像を収めることができますか?

:それだけです。バウンティの締め切りはここにあり、いくつかの厳しい審議の後、Boojumのエントリは、Sam Hocevarのエントリをかろうじて取り除いたと判断しました。それらを書く機会があったら、私はより詳細なメモを投稿します。もちろん、誰もが自由に気軽に解決策を提出し、人々が投票できるように解決策を改善してください。応募してくださった皆様、ありがとうございました。私はそれらすべてを楽しんだ。これは私が走るのがとても楽しかったです、そしてそれが参加者と観客の両方にとって楽しいことを願っています。

画像をTwitterのコメントに圧縮しようとするこの興味深い投稿に出くわしました。そのスレッド(およびRedditのスレッド)の多くの人々が、さまざまな方法について提案をしてくれました。ですから、それは良いコーディング課題になると思います。人々がお金を自分の口に置くことを許可し、エンコーディングに関する彼らのアイデアがあなたが利用できる限られたスペースでより詳細にどのようにつながることができるかを示してください。

画像を140文字のTwitterメッセージにエンコードし、再度画像にデコードするための汎用システムを考え出すことをお勧めします。Unicode文字を使用できるので、1文字あたり8ビットを超えます。ただし、Unicode文字を使用できる場合でも、画像を非常に小さなスペースに圧縮する必要があります。これは確かに非可逆圧縮になるため、各結果の見栄えについて主観的な判断が必要になります。

オリジナルの作者であるQuasimondoがエンコーディングから得た結果は次のとおりです(画像はCreative Commons Attribution-Noncommercialライセンスの下でライセンスされています): モナリザ

あなたはもっとうまくできますか?

ルール

  1. プログラムには、エンコーディングデコーディングの 2つのモードが必要です。
  2. エンコードするとき:
    1. プログラムは、選択した任意の適切なラスターグラフィック形式のグラフィックを入力として受け取る必要があります。ImageMagickでサポートされているラスター形式はすべて妥当と見なされます。
    2. プログラムは、140以下のUnicodeコードポイントで表現できるメッセージを出力する必要があります。140コード範囲内の点U+0000- U+10FFFF非文字を除く、( 、、U+FFFE NNここで、Nである- 進数、およびレンジ- )とサロゲートコードポイント(- )。選択した任意の適切なエンコーディングで出力できます。GNUでサポートされているエンコーディングはすべて妥当と見なされ、プラットフォームのネイティブエンコーディングまたはロケールエンコーディングが適切な選択となるでしょう。詳細については、以下のUnicodeノートを参照してください。U+FFFFU+FFFEU+FFFF110U+FDD0U+FDEFU+D800U+DFFFiconv
  3. デコード時:
    1. プログラムは、エンコードモードの出力を入力として受け取る必要があります。
    2. プログラムは、上記で定義されているように、選択した任意の適切な形式で画像を出力する必要がありますが、出力のベクトル形式も問題ありません。
    3. 画像出力は入力画像の近似である必要があります。入力画像に近づくほど、良い結果になります。
    4. デコードプロセスは、上記で指定された出力以外のエンコードプロセスの他の出力にアクセスできない場合があります。つまり、画像をどこかにアップロードして、ダウンロードするためのデコードプロセスのURLなど、ばかげたものを出力することはできません。
  4. ユーザーインターフェイスの一貫性を保つために、プログラムは次のように動作する必要があります。

    1. プログラムは、適切なインタープリターを備えたプラットフォームで実行可能に設定できるスクリプト、または実行可能ファイルにコンパイルできるプログラムでなければなりません。
    2. プログラムでは、最初の引数として、encodeまたはdecodeモードを設定する必要があります。
    3. プログラムは、次の1つ以上の方法で入力を受け取る必要があります(ファイル名を受け取る方法を実装する場合、ファイル名が欠落している場合は、stdinおよびstdoutから読み書きすることもできます)。

      1. 標準入力から入力を受け取り、標準出力に出力を生成します。

        my-program encode <input.png >output.txt
        my-program decode <output.txt >output.png
        
      2. 2番目の引数で指定されたファイルから入力を受け取り、3番目の引数で指定されたファイルに出力を生成します。

        my-program encode input.png output.txt
        my-program decode output.txt output.png
        
  5. あなたの解決策として、投稿してください:
    1. コード全体、または他の場所でホストされているコードへのリンク(非常に長い場合、またはコンパイルするために多くのファイルが必要な場合など)。
    2. コードからすぐに分からない場合、またはコードが長く、人々が要約に興味がある場合の、その機能の説明。
    3. 元の画像、圧縮後のテキスト、およびデコードされた画像を含むサンプル画像。
    4. 他の誰かが考えていたアイデアに基づいて構築している場合は、それらを挙げてください。他人のアイデアを洗練させようとすることは問題ありませんが、それらをアトリビューションする必要あります。

ガイドライン

これらは基本的に、違反する可能性のあるルール、提案、またはスコアリング基準です。

  1. 美学は重要です。私は判断し、他の人が以下に基づいて判断することを提案します:
    1. 出力イメージの見た目、および元のイメージの見た目。
    2. テキストの見栄え。あなたが本当に賢い圧縮スキームを持っているなら、完全にランダムなゴブルディゴックは問題ありませんが、私はまた、画像を多言語の詩、またはそのような何かに変える答えも見たいです。元のソリューションの作者は漢字だけを使用することを決定したことに注意してください。
    3. 興味深いコードと巧妙なアルゴリズムは常に優れています。私は要点まで短く、明確なコードが好きですが、本当に巧妙で複雑なアルゴリズムでも、良い結果が得られる限り問題ありません。
  2. 速度も重要ですが、画像を圧縮するジョブがどれほど優れているかほど重要ではありません。何日も遺伝的アルゴリズムを実行するものよりも、10分の1秒で画像を変換できるプログラムが欲しいです。
  3. 品質が合理的に同等である限り、長いソリューションよりも短いソリューションを優先します。簡潔さは美徳です。
  4. プログラムは、Mac OS X、Linux、またはWindowsで自由に利用できる実装を持つ言語で実装する必要があります。プログラムを実行できるようにしたいのですが、MATLABなどでのみ実行できる優れたソリューションがある場合は、それで問題ありません。
  5. プログラムはできるだけ一般的なものにする必要があります。可能な限り多くの異なる画像で機能するはずですが、他の画像よりも良い結果が得られる場合もあります。特に:
    1. プログラムにいくつかの画像を組み込み、それを照合して参照を書き込んだ後、デコード時に照合画像を生成するのはかなり不十分であり、少数の画像しかカバーしません。
    2. シンプルでフラットな幾何学的形状の画像を取得してそれらをいくつかのベクトルプリミティブに分解できるプログラムはかなり気の利いたものですが、特定の複雑さを超える画像で失敗した場合、おそらく一般的ではありません。
    3. 特定の固定アスペクト比の画像のみを取得でき、それらをうまく使用できるプログラムも問題ありませんが、理想的ではありません。
    4. 白黒の画像は、カラー画像よりも小さなスペースに多くの情報を取り込むことができます。一方、それはそれが適用できる画像のタイプを制限するかもしれません。顔は白黒でうまく写りますが、抽象的なデザインではうまくいかない場合があります。
    5. ほぼ同じ比率でありながら、出力画像が入力よりも小さい場合は、まったく問題ありません。画像を拡大して元の画像と比較する必要がある場合は問題ありません。それがどのように見えるかが重要です。
  6. プログラムは、実際にTwitterを通過して無傷で出力できる出力を生成する必要があります。サポートされている文字の正確なセットに関するドキュメントが見つからなかったため、これは規則ではなくガイドラインにすぎませんが、制御文字、ファンキーな非表示の組み合わせ文字、私用文字などは避ける必要があります。

ルーブリックの採点

承認済みのソリューションを選択するときにソリューションをランク付けする方法の一般的なガイドとして、おそらく25ポイントスケールでソリューションを評価することになります(これは非常に大雑把であり、直接使用するだけではなく、これを基本的なガイドラインとして):

  • エンコーディングスキームが広範囲の入力画像をどれだけうまく再現するかについて15ポイント。これは主観的で審美的な判断です
    • 0はまったく機能しないことを意味します。毎回同じ画像が返されます。
    • 5は、いくつかの画像をエンコードできることを意味しますが、デコードされたバージョンは見苦しく、より複雑な画像ではまったく機能しない可能性があります
    • 10は、広範囲の画像で機能し、見分けが付くことがある心地よい画像を生成することを意味します
    • 15は、一部のイメージの完全な複製を生成し、さらに大きくて複雑なイメージの場合でも、認識可能なものを提供することを意味します。または、おそらくそれはかなり認識できる画像を作成しませんが、オリジナルから明らかに派生した美しい画像を生成します。
  • Unicode文字セットを上手に使用するための 3つのポイント
    • 許可された文字のセット全体を単純に使用する場合は0ポイント
    • Twitterや他のさまざまな状況で安全に転送できる限られた文字セットを使用する場合の1ポイント
    • 漢字表意文字や右から左への文字のみなど、テーマ別の文字サブセットを使用するための2ポイント
    • 読みやすいテキストを生成したり、問題の画像のように見える文字を使用したりするなど、本当にきちんとした処理を行うための3つのポイント
  • 巧妙なアルゴリズムアプローチとコードスタイルの 3つのポイント
    • 画像を縮小し、1ピクセルあたり1ビットとして扱い、base64エンコードするだけの1000行のコードの場合は0ポイント
    • 標準のエンコーディング手法を使用し、よく記述された簡潔なものに対して1ポイント
    • 比較的新しいエンコーディング手法を導入したもの、または驚くほど短くてクリーンなものの2ポイント
    • 実際に良好な結果を生み出す1つのライナー、またはグラフィックエンコーディングの新境地を開くものの3ポイント(これが新境地を開拓するためのポイント数が少ないように思われる場合、この良品の結果は美学のスコアが高い可能性が高いことを覚えておいてください同様に)
  • 2点スピードは。他のすべてが等しい、より速い方が良いですが、上記の基準はすべて速度よりも重要です
  • 1点フリー(オープンソース)ソフトウェアで実行する場合はは、フリーソフトウェアを好むからです(C#がMonoで実行されている限り、C#もこのポイントの対象となります。同様に、MATLABコードがGNU Octaveで実行される場合も対象となります)。
  • 1点すべてのルールを実際に遵守した場合は。これらのルールは少し大きく複雑になっているため、細かい点が1つ間違っているという他の点では良い答えを受け入れますが、実際にすべてのルールに従っている解決策については、もう1つポイントを挙げます。

参考画像

一部の人々はいくつかの参照画像を求めています。あなたが試すことができるいくつかの参照画像を以下に示します。小さいバージョンがここに埋め込まれています。必要な場合、それらはすべて大きいバージョンのイメージにリンクしています。

レナ モナリザ コーネルボックス StackOverflowロゴ

500 repの報奨金を提供しています I上記の基準に基づいて、最高のようなことを(プラス50のそのStackOverflowのキック)ソリューションのために。もちろん、私は他のすべての人にも、ここでお気に入りのソリューションに投票することをお勧めします。

締め切りについて

このコンテストは、賞金がなくなるまで、5月30日土曜日の午後6時頃まで開催されます。コンテストの正確な終了時刻はわかりません。午後5時から7時の間にあるかもしれません。午後2時までに送信されたすべてのエントリを確認することを保証し、午後4時までに送信されたすべてのエントリを確認するために最善を尽くします。その後に解決策が提出された場合、決定を下さなければならない前に、公正に検討する機会がないかもしれません。また、提出が早ければ早いほど、最善の解決策を私が選択できるように投票できる可能性が高くなります。そのため、締め切り間際ではなく、早期に提出してください。

Unicodeノート

どのUnicode文字が許可されているかについて、いくつかの混乱もありました。可能なUnicodeコードポイントの範囲はU+0000U+10FFFF。オープンなデータ交換でUnicode文字として使用することが決して有効ではないいくつかのコードポイントがあります。これらは非文字代理コードポイントです。Noncharactersは、で定義されているUnidode標準5.1.0節16.7値としてU+FFFEU+FFFFU+NFFFEU+NFFFFここで、Nであります1- 。これらの値は、アプリケーション固有の内部使用のために使用されることを意図しており、適合アプリケーションは、それらによって処理されるテキストからこれらの文字を取り除く場合があります。で定義されている代理コードポイント10進数、および範囲U+FDD0-U+FDEFUnicode Standard 5.1.0セクション3.8 as U+D800–はU+DFFF、UTF-16のBasic Multilingual Planeを超えて文字をエンコードするために使用されます。したがって、これらのコードポイントをUTF-16エンコーディングで直接表すことは不可能であり、他のエンコーディングでそれらをエンコードすることは無効です。したがって、このコンテストの目的のために、画像を範囲内の140以下のUnicodeコードポイントのシーケンスにエンコードするすべてのプログラムを許可しますU+0000U+10FFFF上記で定義された全てnoncharactersとサロゲートペアを除きます。

私は割り当てられた文字のみを使用するソリューション、および割り当てられた文字の巧妙なサブセットを使用するか、それらが使用する文字セットで何か面白いことをするより良いソリューションを好みます。割り当てられた文字のリストについては、Unicode文字データベースを参照してください。一部の文字は直接リストされていますが、一部は範囲の開始と終了としてのみリストされていることに注意してください。また、サロゲートコードポイントはデータベースにリストされていますが、上記のように禁止されていることに注意してください。出力するテキストをより興味深いものにするために文字の特定のプロパティを利用したい場合は、名前付きコードブロックのリストなど、利用可能な文字情報のさまざまなデータベースがありますさまざまな文字プロパティます。

Twitterはサポートする正確な文字セットを指定していないため、特定の文字が余分にカウントされる、または特定の文字が削除されるため、Twitterで実際に機能しないソリューションについては寛大になります。すべてのエンコードされた出力がTwitterやidenti.caなどの別のマイクロブログサービスを介して無傷で転送できることが望ましいですが、必須ではありません。Twitterエンティティが<、>、&をエンコードするため、これらをそれぞれ4、4、5文字としてカウントすることを示すドキュメントをいくつか見ましたが、私は自分でテストしていないため、JavaScript文字カウンターが表示されないようですそれらをそのように数える。

ヒントとリンク

  • ルールでの有効なUnicode文字の定義は少し複雑です。CJK統一表意文字(U + 4E00–U + 9FCF)などの単一の文字ブロックを選択する方が簡単な場合があります。
  • 画像操作には、ImageMagickPython Imaging Libraryなどの既存の画像ライブラリを使用できます。
  • Unicode文字セットとそのさまざまなエンコーディングを理解するのに助けが必要な場合は、このクイックガイドまたはLinuxおよびUnixのUTF-8に関するこの詳細なFAQを参照してください。
  • ソリューションを早期に導入するほど、私(および他の人々が投票)が検討する必要がある時間が長くなります。ソリューションを改善すれば、ソリューションを編集できます。ソリューションを最後に確認するときは、最新のバージョンに基づいて賞金を計算します。
  • 簡単な画像形式を解析して書き込む(そして既存の形式だけを使いたくない)場合は、PPM形式の使用をお勧めします。これはテキストベースのフォーマットで、非常に扱いやすく、ImageMagickを使用して変換できます。

私がコメントで書いたルールについての提案を自由に提供してください。明確化が必要だとか、仕様が多すぎると感じた場合は、きちんと調整していきます。
ブライアンキャンベル

6
サーバーへの画像のアップロードと画像へのURLの投稿は無効であると言うべきでしょう。
Shay Erlichmen、2009年

2
@シェイ私はすでにそれを言っていませんでしたか?「デコードプロセスは、上記で指定された出力以外のエンコードプロセスの他の出力にアクセスできない場合があります。つまり、どこかにイメージをアップロードして、デコードプロセスのURLを出力することはできません。 」
ブライアンキャンベル

1
@Konrad Rudolph同意する。私は実際的な観点から「ばかげている」という意味ではありませんでした(明らかに、このコンテスト全体は実際的な観点からばかばかしいです)。URIの使用は、情報理論の意味では、実際には圧縮アルゴリズムではありません。これは、代替チャネルを使用しないと情報を転送できないためです。エンコーダーとデコーダーに画像の大規模なデータベースを与え、それを限られた一連の画像でのみ機能する圧縮と呼ぶことができますが、私は任意の画像を処理できる必要があることを指定しました。
ブライアンキャンベル

2
ここに私が出会ったいくつかのリンクがあります。それらは人々を助けるのに役立ちます:Unicode文字の有効な範囲の説明についてはazillionmonkeys.com/qed/unicode.html。UTFエンコードは、Unicode範囲全体をエンコードできるものであることに注意してください。UCS-4はUnicodeのスーパーセットであり、UCS-2とASCIIはサブセットです。:彼は彼自身を1kのではなく、350バイトが可能だけれどもと圧縮前に、ここでは、オリジナルのポストと同様の手法だscreamingduck.com/Article.php?ArticleID=46&Show=ABCE
ブライアン・キャンベル

回答:


244

さてさて、ここでの鉱山です:nanocrunch.cppCMakeLists.txtのファイルを使用して、それを構築するためにCMakeのを。ほとんどの画像処理 はMagick ++ ImageMagick API に依存しています。また、文字列エンコーディング用のbignum演算用のGMPライブラリも必要です。

私のソリューションはフラクタル画像圧縮に基づいており、いくつかユニークな工夫をしています。基本的な考え方は、画像を取り、コピーを50%に縮小し、元の画像の重複しないブロックに似たさまざまな方向の断片を探すことです。この検索は非常にブルートフォースで行われますが、これにより、変更を簡単に導入できます。

最初の変更点は、90度の回転と反転だけを見るのではなく、45度の向きも考慮することです。ブロックごとに1ビット多くなりますが、画質を非常に向上させます。

もう1つは、各ブロックの各カラーコンポーネントのコントラスト/明るさの調整を保存するのが非常に高価であることです。代わりに、ある割合で単純にブレンドされる、非常に量子化された色(パレットには4 * 4 * 4 = 64色しかない)を保存します。数学的には、これは各色の明るさを変化させ、コントラストを一定に調整することと同じです。残念ながら、これはまた、色を反転させるための負のコントラストがないことも意味します。

各ブロックの位置、方向、色が計算されると、これをUTF-8文字列にエンコードします。最初に、ブロックテーブルのデータと画像サイズを表す非常に大きなbignumを生成します。これに対するアプローチは、Sam Hocevarのソリューションに似ています-位置によって異なる基数を持つ大きな数のようなものです。

次に、それを使用可能な文字セットのサイズが何であれ、そのベースに変換します。デフォルトでは、割り当てられたUnicode文字セットから、アンパサンド、制御文字、結合文字、代理文字およびプライベート文字を引いた、「より小さい」、「より大きい」を差し引いたものをフルに活用します。それはきれいではありませんが、動作します。代わりに、デフォルトのテーブルをコメント化して、印刷可能な7ビットASCII(<、>、および&文字を除く)またはCJK統一イデオグラフを選択することもできます。使用可能な文字コードのテーブルには、無効な文字と有効な文字の交互のランでエンコードされたランレングスが格納されています。

とにかく、これはいくつかの画像と時間(私の古い3.0GHz P4で測定したもの)であり、上記の割り当てられた完全なユニコードセットで140文字に圧縮されています。全体として、私はそれらがすべて判明した方法にかなり満足しています。これに取り組む時間がもっとあれば、解凍された画像のブロックノイズを減らすようにしようと思います。それでも、結果は極端な圧縮率ではかなり良いと思います。解凍された画像は少し印象的ですが、ビットが元の画像にどのように対応しているかは比較的簡単にわかります。

スタックオーバーフローのロゴ(エンコードに8.6秒、デコードに7.9秒、485バイト):http ://i44.tinypic.com/2w7lok1.png

Lena(エンコードに32.8秒、デコードに13.0秒、477バイト):
http ://i42.tinypic.com/2rr49wg.png http://i40.tinypic.com/2rhxxyu.png

モナリザ(エンコードに43.2秒、デコードに14.5秒、490バイト):http ://i41.tinypic.com/ekgwp3.png
http://i43.tinypic.com/ngsxep.png

編集:CJK統一文字

SamはCJKでこれを使用することについてコメントで尋ねました。これは、CJK統一文字セットから139文字に圧縮されたモナリザのバージョンです。

http://i43.tinypic.com/2yxgdfk.png 璘驞璘驞脒鵚脒鵚蛥鸂朐朐韩韩魷魷痫栘璯緍脲蕜揎揎蓼鑡嗞靊痫栘璯緍脲蕜揎聚聚聚聚隤慛ッ ト 馿ー馿櫰櫰昀昀撄撄撄敽敽敽敽敽敽敽伆杇婣惹鐤諽鷍鴞駫ー毤埙誖萜旖鞰萗旖鞰萗旖鞰萗リスティング擸萿

これに使用したプログラムの上部にあるチューニングパラメーターは、19、19、4、4、3、10、11、1000、1000でした。number_assignedとコードの最初の定義をコメントアウトし、コメントを外しましたCJK統一文字セットを選択するためのそれらの最後の定義。


うわー!良くやった。この小さい画像のフラクタル画像圧縮には懐疑的でしたが、実際にはかなりまともな結果が得られます。また、コンパイルと実行も非常に簡単でした。
ブライアンキャンベル

1
みんなありがとう!サム、140のCJK文字だけの結果を意味しますか?もしそうなら、はい、あなたは上部にある数値を調整する必要があります。ビット単位の最終サイズは、log2(steps_in_x steps_in_y steps_in_red steps_in_green steps_in_blue)* blocks_in_x blocks_in_y + log2(maximum_width maximum_height)前後です。
Boojum

編集:私が省略した最初のlog2()に* 16があります。それは可能なオリエンテーションのためです。
Boojum

20
誰かがこれを使って画像をtwitter化したことはありますか?
DBR

288

画像ファイルとPythonソース(バージョン1および2)

バージョン1これ が私の最初の試みです。随時更新していきます。

私はSOロゴを300文字までほぼ無損失にしています。私のテクニックは、SVGベクターアートへの変換を使用しているため、ラインアートに最適です。それは実際にはSVGコンプレッサーですが、それでもオリジナルのアートがベクトル化段階を経る必要があります。

私の最初の試みでは、PNGトレースにオンラインサービスを使用しましたが、potrace(オープンソース)を含め、この部分を処理できる多くの無料ツールと非無料ツールがあります。

これが結果です

オリジナルのSOロゴhttp://www.warriorhut.org/graphics/svg_to_unicode/so-logo.pngオリジナルの デコードされたSOロゴhttp://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded.pngエンコード後解読

キャラクター:300

時間:測定されていませんが、実際には瞬間的です(ベクトル化/ラスター化の手順は含まれません)。

次の段階では、ユニコード文字ごとに4つのシンボル(SVGパスポイントとコマンド)を埋め込みます。現在のところ、Pythonビルドにはワイド文字サポートのUCS4がないため、文字ごとの解像度が制限されています。最大範囲をユニコード予約範囲0xD800の下限に制限しましたが、許可された文字のリストとそれらを回避するためのフィルターを作成したら、理論的には必要な文字数を70〜100にして、上記のロゴ。

現在、このメソッドの制限は、出力サイズが固定されていないことです。ベクトル化後のベクトルノード/ポイントの数に依存します。この制限を自動化するには、イメージをピクセル化する(ベクトルの主な利点を取り除く)か、目的のノード数に達するまでパスを単純化段階で繰り返し実行する必要があります(現在はInkscapeで手動で実行しています)。

バージョン2

更新:v2が競争する資格を得ました。変更:

  • コマンドライン制御の入出力とデバッグ
  • 正規表現の代わりにXMLパーサー(lxml)を使用してSVGを処理する
  • ユニコードシンボルごとに2つのパスセグメントをパックします
  • ドキュメントとクリーンアップ
  • style = "fill:color"とfill = "color"をサポート
  • 単一の文字にパックされたドキュメントの幅/高さ
  • 単一の文字にパックされたパスの色
  • 色圧縮は、色ごとに4ビットの色データを破棄し、16進変換を介して文字にパックすることによって実現されます。

キャラクター133

時間:数秒

v2デコードhttp://www.warriorhut.org/graphics/svg_to_unicode/so-logo-decoded-v2.pngエンコードおよびデコード後(バージョン2)

ご覧のとおり、今回はアーティファクトがいくつかあります。これはメソッドの制限ではなく、変換のどこかでの間違いです。アーティファクトは、ポイントが0.0〜127.0の範囲外になると発生し、それらを制約する私の試みは、さまざまな成功を収めました。解決策は単純に画像を縮小することですが、アートボードやグループマトリックスではなく実際のポイントを縮小するのに問題があり、私はあまりに疲れて気になりません。つまり、ポイントがサポートされている範囲内であれば、通常は機能します。

真ん中のねじれは、リンクされているハンドルの反対側に移動するハンドルが原因であると思います。基本的に、ポイントはそもそも近すぎます。ソース画像を圧縮する前に単純化フィルターを実行すると、これが修正され、いくつかの不要な文字が削られます。

更新:この方法は単純なオブジェクトには適しているため、複雑なパスを簡略化してノイズを減らす方法が必要でした。このタスクにはInkscapeを使用しました。私はInkscapeを使用して不要なパスをグルーミングすることに少しは運がありましたが、自動化する時間はありませんでした。パスの数を減らすために、Inkscapeの 'Simplify'関数を使用してサンプルsvgをいくつか作成しました。

単純化は問題なく動作しますが、このように多くのパスがあると遅くなる可能性があります。

自動 トレースの 例http://www.warriorhut.org/graphics/svg_to_unicode/autotrace_16_color_manual_reduction.png cornell box http://www.warriorhut.com/graphics/svg_to_unicode/cornell_box_simplified.png lena http://www.warriorhut.com/graphics /svg_to_unicode/lena_std_washed_autotrace.png

トレースされたサムネイルhttp://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_autotrace.png

これが超低解像度ショットです。これらは140文字の制限に近くなりますが、巧妙なパスの圧縮も必要になる場合があります。

グルーミングhttp://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_groomed.png 簡略化して斑点を除去。

trianglulated http://www.warriorhut.org/graphics/svg_to_unicode/competition_thumbnails_triangulated.png 簡略化、スペックル除去、三角化。

autotrace --output-format svg --output-file cornell_box.svg --despeckle-level 20 --color-count 64 cornell_box.png

ABOVE:使用して簡素化されたパス自動トレースを

残念ながら、私のパーサーは自動トレース出力を処理しないため、ポイントがどのように使用されているか、またはどの程度簡略化できるかわかりません。残念ながら、期限までに書き込む時間はほとんどありません。ただし、inkscapeの出力よりも解析がはるかに簡単です。


2
優秀な!最初は、鋭いエッジと滑らかな領域の両方を備えたハイブリッドベクトルソリューションを作成したかったのですが、トレースライブラリ(使用したくない)を使用しないと複雑すぎることがわかりました。あなたがあなたの方法でどれだけ遠くまで行くことができるかを楽しみにしています!
sam hocevar 2009年

いいね!ベクトル化によるほぼ無損失のアプローチのいくつかの試みが見られることを望んでいました。つまり、一般性は低くなりますが、カバーする画像の品質は高くなります。ベクトル化にオンラインサービスを使用することは問題ありません。さらにサイズを下げて頑張ってください!
ブライアンキャンベル

私は、画像圧縮と文字エンコーディングを2つの異なるステップと見なします。Samの手法はエンコーディングに最適であるように思われ、スタンドアロンプ​​ログラムに簡単に組み込むことができます。ソリューションのユニークな部分(つまり、圧縮部分)に集中し、ビットの文字列を出力するだけで、より多くの効果が得られます。
マークランサム

70
ワオ。これらの画像は本当にスタイリッシュに見えます。
Rinat Abdullin

199

私の完全な解決策はで見つけることができます http://caca.zoy.org/wiki/img2twit。次の機能があります。

  • 適度な圧縮時間(高品質の場合は約1分)
  • 高速解凍(ほんの一瞬)
  • 元の画像サイズを維持します(アスペクト比だけではありません)
  • まともな再建品質(IMHO)
  • メッセージの長さと文字セット(ASCII、CJK、記号)は実行時に選択できます
  • メッセージの長さと文字セットは解凍時に自動検出されます
  • 非常に効率的な情報パッキング

http://caca.zoy.org/raw-attachment/wiki/img2twit/so-logo.png http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter4.png

なんとなく秓鋖筷聝诿缰偺腶漷庯祩秓鋖筷聝诿缰偺腶漷庯祩靊谪獜幻幻幻欇渹軱骿苸髙骟軱骿苸髙骟玧霫鏓蓕ь債鼶襋躻曲げインストーラ足庭侅旍凼飙トランクス墤渽緛赐掔倾诗籂阉嶹婻墤渽緛赐墤渽緛赐儅棫掔倾诗籂阉嶹婻鼶襋躻鼶襋躻翉翉翉翉翉翉動舥攩肝亖弜喆蝞躐葌熲谎蛪曟暙刍镶媏嘝驌慸盂盂缰殾譑

エンコードプロセスの概要は次のとおりです。

  • 使用可能なビット数は、目的のメッセージ長と使用可能な文字セットから計算されます
  • ソース画像は、利用可能なビットが許す限り多くの正方形のセルに分割されます
  • 固定数のポイント(現在は2)が各セルに影響し、初期座標とカラー値が含まれます
  • 以下は、品質条件が満たされるまで繰り返されます。
    • ポイントはランダムに選ばれます
    • このポイントで操作がランダムに実行されます(セル内に移動し、色を変更します)
    • 結果の画像(以下のデコードプロセスを参照)がソース画像に近い場合、操作は保持されます
  • 画像サイズとポイントのリストはUTF-8でエンコードされています

そして、これはデコードプロセスです:

  • 画像のサイズとポイントはUTF-8ストリームから読み取られます
  • 宛先画像の各ピクセルについて:
    • 自然隣人のリストが計算されます
    • ピクセルの最終的な色は、その自然な近傍の色の加重平均として設定されます

プログラムの最も独創的な部分はビットストリームだと私は信じています。ビット境界値(stream <<= shift; stream |= value)をパックする代わりに、2のべき乗の範囲にない任意の値をパックします(stream *= range; stream += value)。これにはbignum計算が必要であり、もちろんかなり遅くなりますが、20902のメインCJK文字を使用すると、1960ではなく2009.18ビットになります(データに追加できる3つのポイントです)。また、ASCIIを使用すると、840ではなく917.64ビットになります。

最初は本当に役立つかどうかわからなかったので、重い武器(コーナー検出、特徴抽出、カラー量子化...)を必要とする最初の画像計算方法に反対しました。収束が遅いことに気づきました(1分は許容範囲ですが、それでも遅いです)。それを改善しようとするかもしれません。

メインフィッティングループは、Direct Binary Seachディザリングアルゴリズム(ピクセルがランダムに入れ替えられるか、より適切なハーフトーンが得られるまで反転される)から緩やかに着想を得ています。エネルギーの計算は単純な二乗平均距離ですが、最初に元の画像に対して5x5の中央値フィルターを実行します。ガウスぼかしはおそらく人間の目の振る舞いをよりよく表すでしょうが、私は鋭いエッジを失いたくありませんでした。また、プロセスを調整するための月がないため、シミュレーテッドアニーリングやその他の調整が難しい方法に反対することも決定しました。したがって、「品質」フラグは、エンコーダが終了する前に各ポイントで実行される反復数を表します。

http://caca.zoy.org/raw-attachment/wiki/img2twit/Mona_Lisa_scaled.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/twitter2.png

苉憗嶕繠嶕繠腏篮茝霮墧蒆棌杚蓳縳茝霮墧蒆棌杚蓳縳茝霮墧蒆棌杚蓳縳茝霮墧蒆棌杚蓳縳茝霮墧蒆棌杚蓳縳飗噹砃燋朓峂釰茝霮墧蒆棌杚蓳縳髎髎髎氲簵鸬嫤鉸俇激しくお邪魔している鄴甮槺骳佛愚猪坼堭颽箽矯坼堭颽箽ー飉ン飉ク偁ク窂蹻熛漧衆橼の航玴毡裋頢イ恺墎嬔鑹楄瑥鶼呍蕖抲鸝秓苾绒酯嵞脔婺污囉酼俵菛琪棺则辩辣鸸職斬蒝礭蒝礭召蟺稿纡醾陴鳣尥螟瘡鋁髚忩祤脤养趯沅鋁髚忩祤脤养趯沅事件

すべての画像が適切に圧縮されるわけではありませんが、その結果には驚いており、画像を250バイトに圧縮できる他の方法が存在するのではないかと本当に思っています。

私はまた、エンコーダの状態の進化の小さな映画を持っているランダムな初期状態からして「良い」初期状態から

編集:ここでは、圧縮方法とJPEGの比較方法を示します。左側は、jamoesの536バイトより上の画像です。右側では、モナリザはここで説明されている方法を使用して534バイトに圧縮されています(ここで説明されているバイトはデータバイトを指しているため、Unicode文字を使用することで無駄になったビットは無視されます)。

http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona.jpg http://caca.zoy.org/raw-attachment/wiki/img2twit/minimona2.png

編集:CJKテキストを最新バージョンの画像に置き換えました。


私は実際にコードを実行できる必要はありません(ルールではなく、提案として、ガイドラインの実行に関する部分をガイドラインに入れました)。私はそれを実行できることを望みますが、これは、生成する画像の品質、コード、および興味深いトリックやアルゴリズムによってさらに判断します。実行したいが、メインシステムにインストールしたくないパッケージやインストールしたくないパッケージが必要な場合は、Amazon EC2インスタンスを起動してインストールするだけです。主要なディストリビューションの1つ用にパッケージ化されたライブラリーを使用している限り、私はそれを実行できるはずです。CGALを自由に使用してください。
ブライアンキャンベル、

2
さて、ここで私の解決策は、(ソースコード)です:caca.zoy.org/browser/libpipi/trunk/examples/img2twit.cpp 私の説明しようといくつかの例は、であるcaca.zoy.org/wiki/img2twit
サム・ホスバー

2
私はあなたのソリューションが本当に好きです。人間の目は青をうまく解決できないため、青チャネルに割り当てる値の数を減らしてみてください。nfggames.com / games / ntsc / visual.shtm ; これにより、一部のカラー情報が失われる代わりに、より詳細な情報を得ることができます。それとも緑に割り当てますか?
rpetrich 2009年

5
いい視点ね。私はこのアイデアのいくつかのバリエーションを試しましたが(RANGE_X定義の前のコメントを参照)、あまり徹底的にではありませんでした。ご覧のように、6の代わりに5つの青の値を使用すると、緑の7つの値を使用するよりもエラーがわずかに増加し、減少しました。私は怠惰から両方をしようとはしませんでした。もう1つの問題は、エラー関数があまりよくないことです。私は現在∑(∆r² + ∆g² + ∆b²)/ 3を使用していますが、これは問題なく動作します。私はYUVのYコンポーネントに基づいて(物理的に正当化せずに)∑(0.299Δr²+0.587Δg²+0.114Δb²)を試しましたが、ブルーエラーに対して許容度が高すぎました。この問題についての論文を探します。
sam hocevar 2009年

2
@rpetrich:十分なビットがある限り、r / g / b範囲を動的に増やすようにプログラムを変更しました。これにより、ビットストリーム全体で13ビットを超えて無駄になることがなくなります(ただし、実際には通常1または2です)。そして、画像は少し良く見えます。
sam hocevar 2009年

45

以下は、私のソフトウェアが指定されたタスクに合わせて調整されていないため、正式な提出ではありません。 DLIは、最適化された汎用非可逆画像コーデックとして説明できます。これは画像圧縮用のPSNRおよびMS-SSIMレコードホルダーであり、この特定のタスクでどのように機能するかを確認することは興味深いと思いました。提供された参照モナリザ画像を使用して100x150に縮小し、DLIを使用して344バイトに圧縮しました。

モナリザDLI http://i40.tinypic.com/2md5q4m.png

JPEGおよびIMG2TWIT圧縮サンプルとの比較のために、DLIを使用して画像も534バイトに圧縮しました。JPEGは536バイト、IMG2TWITは534バイトです。簡単に比較できるように、画像はほぼ同じサイズに拡大されています。JPEGは左側の画像、IMG2TWITは中央、DLIは右側の画像です。

比較http://i42.tinypic.com/302yjdg.png

DLI画像は、いくつかの顔の特徴、特に有名な笑顔を維持しています。


6
おっとっと。上記は、最初にそれを提出したデニス・リーにクレジットされるべきです。編集して、画像をインラインに埋め込み、Googleで見つけた参照へのリンクを追加しました。そして、私は、すごい、私は圧縮に感銘を受けたと言わなければなりません。DLI圧縮をチェックする必要があります。
ブライアンキャンベル

1
ちなみに、DLIの作者は「処理時間が長い」と述べています。私は彼のソフトウェアを実行することができないので、大まかな圧縮時間を教えていただけませんか?
sam hocevar 2009年

1
AMD Athlon64 2.4Ghzを使用すると、100x150 Mona Lisaイメージの圧縮に38秒、解凍に6秒かかります。最大251バイトに圧縮すると、出力品質が大幅に低下します。参照モナリザ画像を使用して、60x91に縮小し、DLIを使用して243バイトに圧縮しました(先に進むことなく251に最も近い)。これは出力です。ただし、イメージの構造はかなりよく維持されています。

1
250バイトの圧縮サンプルを比較しやすくすることにしました。243バイトのDLIが拡大され、IMG2TWITサンプルの横に配置されました。左側がIMG2TWIT、右側がDLI。こちらが画像i40.tinypic.com/30ndks6.png

1
DLIはJPEGのような品質パラメーターを使用するため、ターゲット出力サイズが必要な場合は試行錯誤が必要です。

21

私のソリューションの一般的な概要は次のようになります:

  1. 最初に、140 utf8文字に収まる最大量の生データを計算します。
    • (元のウェブサイトがTwitterがメッセージを保存したと主張した元のWebサイトであるutf8を想定しています。これは、utf16を要求する上記の問題ステートメントとは異なります。)
    • このutf8 faqを使用して、1つのutf8文字でエンコードできる最大ビット数は31ビットであると計算します。これを行うには、U-04000000〜U-7FFFFFFFの範囲にあるすべての文字を使用します。(1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx、31個のxがあるため、31ビットまでエンコードできます)。
    • 31ビットx 140文字は4340ビットに相当します。これを8で除算して524.5を取得し、それを542バイトに切り捨てます
    • (utf16に制限すると、1文字あたり2バイトしか格納できません。これは280バイトに相当します)。
  2. 標準のjpg圧縮を使用して画像を圧縮します。
    • 画像のサイズを約50x50pxに変更してから、さまざまな圧縮レベルで画像を圧縮し、542バイトにできるだけ近づくようにしてください。
    • これは、 536バイトに圧縮されたモナリザのです。
  3. 圧縮画像の生ビットをutf-8文字にエンコードします。
    • 次のバイトの各xを置き換えます。1111110x10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxxをイメージのビットに置き換えます。
    • この部分はおそらく、現在これを行うものは何もないので、コードの大部分を書く必要がある部分でしょう。

あなたがコードを求めていたのは知っていますが、実際にこれをコード化するために時間を費やしたくありません。私は、効率的な設計が少なくとも誰かにこれをコード化するように刺激するかもしれないと考えました。

私の提案するソリューションの主な利点は、既存のテクノロジーをできるだけ多く再利用することだと思います。良い圧縮アルゴリズムを書いてみるのは楽しいかもしれませんが、そこにはより優れたアルゴリズムがあることが保証されています。

ただし、もう1つの重要な注意事項は、utf16が優先エンコーディングであると判断された場合、このソリューションはバラバラになるということです。jpegは、280バイトに圧縮すると実際には機能しません。ただし、この特定の問題ステートメントには、jpgよりも優れた圧縮アルゴリズムがある可能性があります。


今は仕事中ですが、帰宅したらこのソリューションを確実に実装しています。
Paulo Santos、

2
私の実験から、UTF-16は確かにTwitterが文字をカウントする方法のようです。BMP文字は1としてカウントされ、上位の平面文字は2としてカウントされます。ドキュメントには記載されていませんが、入力ボックスに入力したときのJavaScript文字カウンターのカウント方法です。元のスレッドのコメントにも記載されています。私は、カウンターが壊れているかどうかを確認するために、API経由で送信を試みていません。もしそうなら、私は実際の制約の問題を更新します。ただし、エンコードできる長いシーケンスの多くは有効なUnicodeではないため、任意のUTF-8を使用できる可能性は低いです。
ブライアンキャンベル

4
APIを使用してテストした後、UTF-16コード単位ではなく、Unicode文字(コードポイント)でカウントすることがわかります(これは、JavaScriptの長さメソッドが明らかにそうしているため、UTF-16を介してカウントするのはJavaScript文字カウンターです)。 。そこで、もう少し情報を得ることができます。有効なUnicode文字は、U + 0000からU + 10FFFFの範囲です(1文字あたり20ビットを少し超える、1文字あたり2 ^ 20 + 2 ^ 16の可能な値)。UTF-8を使用すると、いない542スペースの約350バイトを取得することができ、あなたがUnicodeに自分自身を制限している場合は、Unicodeで許可されているよりも多くの値を符号化することができます
ブライアン・キャンベル

3
536バイトのモナリザは、極端な圧縮を考えると、驚くほど見栄えがします。
クリス

3
現在、129,775の異なる(割り当てられた、非コントロール、非プライベート)Unicode文字をエンコードできます。そのサブセットに限定すると、合計2377ビット、つまり297バイトになります。ここにコード:porg.es/blog/what-c​​an-we-fit-in-140-characters
ポルゲス

20

さて、私はゲームに遅れましたが、それでも私は自分のプロジェクトを作りました。

それは、半透明のカラフルな円を使って初期画像を再現するおもちゃの遺伝的アルゴリズムです。

特徴:

  • 純粋なルア。Luaインタープリターが実行される場所ならどこでも実行されます。
  • netpbm P3形式を使用
  • 単体テストの包括的なスイートが付属しています
  • 元の画像サイズを保持

Mis-feautres:

  • スロー
  • このスペースの制約では、初期画像の基本的な配色と、そのいくつかの機能の一般的な概要のみが保持されます。

レナを表すtwitの例は次のとおりです。岂掂戇耔攋斘眐奡萛狂昸鵺亲嬎廙栃兡塅受橯不適切应鵺优猫僘僘吱賾卣杈腠綍蝘猕杈腠綍蝘猕悡悡噩压噩压噩压噩压虤虤虤虤虲兙縨炘縨炘叁抠堃弅弅弅缩缩缩缩缩癳癳癳囤璟彔囤璟彔囤璟彔囤璟彔囤璟彔兠摈厇プロバイダー焛瀻严啘刱垫仔

元のレナ エンコードされたLena

コードはbitbucket.orgのMercurialリポジトリにあります。http://bitbucket.org/tkadlubo/circles.luaをチェックしてください。


2
驚くばかり!きちんとした芸術的な画像を作成します。人々がまだこれに取り組んでいるのは嬉しいです。さまざまなアプローチをすべて見るのは楽しいことです。
ブライアンキャンベル

1
これをオリジナルの透明なオーバーレイのように使用して、ボケ効果のようなものを作りたいと思います。
Nick Radford

19

以下は私の問題へのアプローチであり、これは取り組むのに非常に興味深いプロジェクトであったことを認めなければなりません。それは明らかに私の通常の仕事の範囲外であり、新しいことを学ぶことができました。

私の背後にある基本的な考え方は次のとおりです。

  1. 合計16の異なるシェードが存在するように、画像のグレースケールをダウンサンプリングします。
  2. 画像にRLEをプリフォームする
  3. 結果をUTF-16文字にパックします
  4. パックされた結果に対してRLEを実行して、文字の重複を削除します

これは機能しますが、以下のサンプル画像からわかるように、限られた範囲でのみ機能します。出力に関しては、特にサンプルに示されているLena画像のサンプルツイートを次に示します。

乤乤万乐唂伂倂倁企儂2企倁3企倁2企伂8企伂3企伂5企倂倃伂倁3企企企2伂倃5企倁3企倃4企倂企倁企伂2企伂5企倁企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷クラ䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶イン焻

ご覧のとおり、文字セットを少し制限してみました。しかし、画像の色データを保存するときにこれを実行する際に問題が発生しました。また、このエンコードスキームは、追加の画像情報に使用できるデータのビットの束を無駄にする傾向があります。

実行時間に関しては、小さな画像の場合、コードは非常に高速で、提供されるサンプル画像では約55msですが、画像が大きくなると時間が長くなります。512x512 Lena参照画像の場合、実行時間は1182msでした。コード自体がパフォーマンスに最適化されていない可能性がかなり高いことに注意してください(たとえば、すべてがビットマップとして処理されます))可能性がため、リファクタリング後に時間が少し短くなる可能性があることに注意してください。

私がもっとうまくやれたかもしれないこと、またはコードのどこが間違っているかについての提案を遠慮なく提供してください。実行時間とサンプル出力の完全なリストは、次の場所にあります。http//code-zen.info/twitterimage/

1つを更新

基本的なルックバックを行うためにツイート文字列を圧縮するときに使用されるRLEコードを更新しました。その場合は、それを出力に使用してください。これは数値のペアに対してのみ機能しますが、データのいくつかの文字を節約します。実行時間は画質とほぼ同じですが、ツイートは少し小さくなる傾向があります。テストが完了したら、ウェブサイトのグラフを更新します。次の例は、つぶやき文字列の例の1つです。これも、小さなバージョンのLenaの場合です。

乤乤万乐唂伂倂倁企廠2企倁3企倁ウ伂8企伂エ伂5企倂倃伂倁グゥー企2伂倃ガ倁ジ倃4企倂企倁企伂ツ伂ス伂企伂쥹皗鞹鐾륶䦽阹럆䧜椿籫릹靭욶옷뎷歩㰷ク䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶䴗鑹㞳鞷㬼獴鏙돗鍴祳㭾뤶焻焻乹Ꮛ

2つ更新

別の小さな更新ですが、4つではなく3つのグループに色合いをパックするようにコードを変更しました。これにより、より多くのスペースが使用されます。データです。また、圧縮をもう少し更新して、カラーカウントブロックだけではなく、文字列全体に作用できるようにしました。まだランタイムをテストしていますが、名目上は改善されているようです。ただし、画質は変わりません。以下は、Lenaツイートの最新バージョンです。

2乤万乐唂伂倂倁企企2企倁3企倁ウ伂8企伂エ伂5企倂倃伂倁グゥー企2伂倃ガ倁ジ倃4企倂企倁企伂企倁ツ伂​​ス倁企伂坹坼坶坻刾啩容力吹婩媷劝圿咶坼゚ ー ル 啭リ嗆婣クリー嗆婣咛啫凃咛啫凃坍媗媗媗兴兴兴兴兴兴兴兴商嗉乃

StackOverflowロゴhttp://code-zen.info/twitterimage/images/stackoverflow-logo.bmp Cornell Box http://code-zen.info/twitterimage/images/cornell-box.bmp Lena http:// code-zen .info / twitterimage / images / lena.bmp モナリザhttp://code-zen.info/twitterimage/images/mona-lisa.bmp


1
エントリーありがとうございます。グレイスケールは実際にはこれらのほとんどに対してかなりうまく機能しますが、レナは理解するのが少し難しいです。私はあなたのソースを探していましたが、404を取得しました。そこにあることを確認できますか?
ブライアンキャンベル、

もう一度確認してください。サイトを更新していました。
rjzii 2009年

はい、ダウンロードできます。もちろん、Monoでコンパイルできるかどうかを確認する必要があります。
ブライアンキャンベル、

うん!Monoで動作し、「gmcs -r System.Drawing TwitterImage.cs Program.cs」でコンパイルし、「mono TwitterImage.exe encode lena.png lena.txt」で実行
ブライアンキャンベル

涼しい!使用しているライブラリがMono用にリストされていることを確認するためにダブルチェックを行いましたが、実際にはMonoをまだ使用していないため、使用できるかどうかはわかりませんでした。
rjzii 2009年


12

元のチャレンジでは、サイズ制限は、テキストボックスにテキストを貼り付けて「更新」を押した場合にTwitterが送信できるものとして定義されています。一部の人々は、これが携帯電話からSMSテキストメッセージとして送信できるものとは異なることに正しく気づいたためです。

明示的に言及されていないのは(しかし、私の個人的なルールは)、ブラウザでツイートされたメッセージを選択し、クリップボードにコピーして、デコーダのテキスト入力フィールドに貼り付けて、表示できるようにする必要があります。もちろん、メッセージをテキストファイルとして保存し、それを読み返すか、Twitter APIにアクセスして画像コードのように見えるメッセージを除外するツールを書くこともできます(特別なマーカーはありますか?wink wink)。しかし、ルールは、メッセージをデコードできるようになる前に、メッセージがTwitterを通過しなければならないということです。

350バイトで頑張ってください。それらを利用できるようになるとは思いません。


1
はい、文字セットに対するより厳しい制限が望ましいが必須ではないことを示すスコアリングルーブリックを追加しました。メッセージが無傷でTwitterを通過することを要求するルールが欲しいのですが、それが機能するかどうかの正確な詳細を理解するために多くの試行錯誤を要するでしょう。コードスペース。したがって、私の課題の唯一の要件は、140の有効なUnicode文字です。ところで、立ち寄ってくれてありがとう!私はあなたの解決策が本当に好きで、キビッツァーのいずれかが実際にそれを改善できるかどうかを確認したいと思います。
ブライアンキャンベル、

12

モノクロまたはグレースケールの画像を投稿すると、色を気にする必要がないため、そのスペースにエンコードできる画像のサイズが改善されます。

おそらく、3つの画像をアップロードするという課題を増大させ、再結合すると、個別の画像ごとにモノクロバージョンを維持しながらフルカラー画像が得られます。

上記に圧縮を追加すると、実行可能に見える可能性があります...

いいね!!! 今、皆さんは私の興味をそそりました。残りの作業は行われません...


9
s / peaked / piqued / g
eleven81

1
私は3つの画像のアイデアが好きです。そのようなアイデアをTwitterに実装できれば、結果はかなり良いものになります。
マキス

9

この課題のエンコード/デコード部分について。 base16b.orgは、上位のUnicodeプレーンでバイナリデータを安全かつ効率的にエンコードするための標準的な方法を指定しようとする私の試みです。

いくつかの機能:

  • Unicodeのプライベートユーザー領域のみを使用
  • 1文字あたり最大17ビットをエンコードします。Base64の約3倍の効率
  • エンコード/デコードのリファレンスJavascript実装が提供されています
  • TwitterやWordpressなど、いくつかのサンプルエンコーディングが含まれています

申し訳ありませんが、この答えは元の競争には遅すぎます。途中で発見したこの投稿とは別にプロジェクトを開始しました。


8

参照画像の束を保存するという考えは興味深いものです。たとえば25Mbのサンプル画像を保存し、エンコーダーにそれらのビットを使用して画像を構成させることは、それほど間違っているでしょうか?このような非常に微細なパイプを使用すると、両端の機械は必然的に通過するデータの量よりもはるかに大きくなるので、25Mbのコードと1Mbのコードと24Mbの画像データの違いは何でしょうか。

(元のガイドラインでは、すでにライブラリにある画像への入力を制限することを除外していることに注意してください-私はそれを示唆していません)。


1
どちらかのエンドポイントに固定された有限量のデータがある限り、それで問題ありません。もちろん、統計的な自然言語プロセスの問題と同様に、トレーニングセットに含まれていない画像でも機能することを示す必要があります。画像のエンコーディングに統計的なアプローチを取るものが見たいです。
ブライアンキャンベル、

16
私としては、ボナフェットのファンアートのみをソースとして使用してモナリザをやり直したいと思います。
Nosredna 2009年

私は同意します-フォトモザイクのアプローチはルールの範囲内にあるようで、誰かが刺すのを見ることは非常に興味深いでしょう。
An̲̳̳drew 2009年

8

ばかげたアイデアですが、sha1(my_image)(衝突を無視して)あらゆるイメージの「完全な」表現になります。明らかな問題は、デコーディングプロセスで非常に大量のブルートフォースが必要になることです。

1ビットモノクロの方が少し簡単です。各ピクセルが1または0になるので、100 * 100ピクセルの画像には1000ビットのデータがあります。SHA1ハッシュは41文字なので、3つを1つのメッセージに収めることができ、2セットの3333ビットと1セットの3334をブルートフォースで実行するだけで済みます(ただし、それでもなお、おそらくは乱暴です)。

それは正確には実用的ではありません。固定長の1ビット100 * 100ピクセルの画像があっても、計算が間違っていないと想定すると、49995000の組み合わせ、または3つに分割した場合は16661667になります。

def fact(maxu):
        ttl=1
        for i in range(1,maxu+1):
                ttl=ttl*i
        return ttl

def combi(setsize, length):
    return fact(length) / (fact(setsize)*fact(length-setsize))

print (combi(2, 3333)*2) + combi(2, 3334)
# 16661667L
print combi(2, 10000)
# 49995000L

10
sha1(my_image)の問題は、力ずくで時間を費やした場合、実際の画像が見つかる前に、多くの衝突が見つかる可能性があることです。そしてもちろん、sha1をブルートフォースで強制することは、計算上ほとんど不可能です。
ブライアンキャンベル、

5
SHA1圧縮よりもさらに優れています。私の「flickr」圧縮アルゴリズムです。ステップ1:画像をflickrにアップロードします。ステップ2:Twitterにリンクを投稿します。タダ!15バイトだけ使用します!
niXar 2009年

2
niXar:いいえ、ルール3.4:「デコードプロセスは、上記で指定された出力以外のエンコードプロセスの他の出力にアクセスできない場合があります。つまり、どこかに画像をアップロードして、デコードプロセスのURLを出力することはできません。ダウンロード、またはそのような愚かなもの。」
2009年

6
私は皮肉なことでした。
niXar 2009年


0

アイデア:フォントをパレットとして使用できますか?ベクターセットの組み合わせで各イメージを説明しようとする一連のベクターで画像を分割しようとします(各文字は基本的にベクターのセットです)。これはフォントを辞書として使用しています。たとえば、垂直線にはalを、水平線には-を使用できますか?ただのアイデア。

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