[解決済み] 数百万のピクセルを持つ2Dの非ボックス化ピクセル配列にはどのようなHaskell表現が推奨されますか?
質問
Haskellで画像処理の問題に取り組みたいと考えています。 私は何百万ものピクセルを持つビットナル(ビットマップ)画像とカラー画像の両方を扱っています。 私はいくつかの質問があります。
-
どのような基準で
Vector.Unboxed
とUArray
? これらは両方とも箱詰めされていない配列ですがVector
の抽象化は、特にループ融合の周りでは、大きく宣伝されているようです。 これはVector
は常に良いのでしょうか? もしそうでなければ はどのような場合に使うべきですか? -
カラー画像の場合、私は16ビット整数のトリプル、または単精度浮動小数点数のトリプルを保存したいと思います。 この目的のために、どちらか
Vector
またはUArray
は使いやすいですか? より高性能? -
ビット画像について、私はピクセルあたり1ビットだけを保存する必要があります。 複数のピクセルを 1 つの単語にパックすることによって、私を助けることができる定義済みのデータ型はありますか、それとも私自身でしょうか?
-
最後に、私の配列は 2 次元です。 私は、quot;array of array" (または vector of vectors) として表現することによって課される余分な間接性を扱うことができると思いますが、私はインデックス マッピング サポートのある抽象化を希望します。 誰か標準ライブラリまたはHackageから何かを推薦することができますか?
私は関数型プログラマで、突然変異は必要ありません:-)
どのように解決するのですか?
多次元配列について、私の見解では、Haskellにおける現在の最良の選択肢は repa .
Repaは、高性能で規則的な多次元・形状多相性の並列配列を提供します。すべての数値データは箱詰めされずに格納される。Repaコンビネータで書かれた関数は、プログラム実行時にコマンドラインで+RTS -Nwhateverを指定すれば、自動的に並列化されます。
最近では、画像処理の問題にも使われている。
私が書き始めたのは の使い方のチュートリアルを書き始めました。 Haskellの配列やvectorライブラリを既に知っている人が始めるには良い場所です。重要な足がかりは、多次元インデックス(およびステンシルも)に対処するために、単純なインデックス型の代わりに形状型を使用することです。
その repa-io パッケージは .bmp 画像ファイルの読み書きのサポートを含んでいますが、 もっと多くの形式のサポートが必要です。
あなたの具体的な質問に対応するため、ここにグラフィックとディスカッションを掲載します。
Vector.UnboxedとUArrayのどちらを選ぶべきか、どのような基準で選べばよいでしょうか。
両者はほぼ同じ表現を持っていますが、主な違いはベクトルを扱うためのAPIの広さです:両者には通常リストと関連付けられるほぼすべての操作(融合駆動型の最適化フレームワークを持つ)がある一方
UArray
にはほとんど API がありません。
カラー画像では、16 ビット整数のトリプルまたは単精度浮動小数点数のトリプルを保存したいと思います。
UArray
は多次元データのサポートに優れており、インデックス付けに任意のデータ型を使用することができます。これは
Vector
(のインスタンスを書くことで)可能です。
UA
のインスタンスを書くことによって)、 それは
Vector
-- の主要な目的ではありません。
Repa
のおかげで、効率的な方法で保存されたカスタムデータ型を非常に簡単に使用することができます。
形状
のおかげで、効率的な方法で保存されたカスタムデータ型を非常に簡単に使用できます。
で
Repa
では、ショートパンツのトリプルはこのタイプになります。
Array DIM3 Word16
つまり、Word16の3次元配列です。
ビット画像では、私はピクセルごとに 1 ビットだけを保存する必要があります。
UArraysはBoolをビットとしてパッキングし、VectorはビットパッキングをしないBoolのインスタンスを使用します。
Word8
. しかし,ベクトルに対するビットパッキング実装は簡単に書けます.
これがその一つです
uvector ライブラリ(廃止されました)からです。フードの下には
Repa
は
Vectors
を使用しているので、そのライブラリの表現の選択を継承しているのだと思います。
複数のピクセルを 1 つの単語にパックすることで、私を助けることができる定義済みのデータ型はありますか。
どのライブラリでも、異なる単語タイプに対して既存のインスタンスを使用できますが、パックされたデータをロールしたりアンロールするためにData.Bitsを使用していくつかのヘルパーを記述する必要があるかもしれません。
最後に、私の配列は 2 次元
UArrayとRepaは効率的な多次元配列をサポートしています。Repaはまた、そうするための豊富なインターフェースを持っています。Vector単体ではそうではありません。
注目すべきは、その言及です。
-
hmatrix
線形代数パッケージへの広範なバインディングを持つカスタム配列タイプです。を使用するようにバインドされるべきです。
vector
またはrepa
のようなタイプがあります。 - ix-shapeable(イクス・シェイパブル 通常の配列から、より柔軟なインデックスを作成することができます。
- 黒板 アンディ・ギルによる、2D画像を操作するためのライブラリです。
- コーデック-イメージ-デビル UArrayに様々な画像形式を読み書きできる。
関連
-
[解決済み] Angular 2のTypeScriptで配列にフィルタをかけるには?
-
[解決済み] Luaで2次元配列を作成するには?
-
[解決済み] Rで3D行列をセットアップし、特定の要素にアクセスする
-
[解決済み] jsonに複数の値を1つのキーで格納する
-
[解決済み] 配列をヒープ化するためのヒープにおけるsiftUp, siftDown操作
-
[解決済み] MATLABのnumel関数とlength関数の違いについて
-
[解決済み] Rubyでハッシュの配列をソートする方法
-
[解決済み] MATLABでn次元の行列の各要素を反復処理するにはどうすればよいですか?
-
[解決済み] Twig のキー付き配列のためのループ
-
[解決済み] Angular 2とTypeScriptで2つのオブジェクト配列をマージする?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】IndexError: Index 10 is out of bounds for axis 0 with size 10
-
[解決済み] Verilogで1次元と2次元のバイト配列を宣言して使用するには?
-
[解決済み] MIPSで配列を作る(アクセスする)方法
-
[解決済み] Angular 2のTypeScriptで配列にフィルタをかけるには?
-
[解決済み] Swift Closuresの$0と$1の意味は何ですか?
-
[解決済み] jsonに複数の値を1つのキーで格納する
-
[解決済み] int (*p)[10]=s と int (*o)[5]=&s の違いは何ですか?
-
[解決済み] MATLABのnumel関数とlength関数の違いについて
-
[解決済み] 選択ソートが安定する理由と不安定な理由
-
[解決済み] Ruby: ハッシュの配列で Enumerator を取得しようとすると nil:NilClass の未定義メソッド `[]' が発生する。