1次、2次元配列のマージソート方法 [VB]
マージソート
クイックソートよりかなり優れたソート方法です。元のデータの並び方が悪いと、クイックソートの効率はバブルソート並みに悪化します。マージソートはそのようなことが無いので効率よくソートを行うことのできるアルゴリズムです。
大まかな名がとしては以下の手順となります。
- 全体を2分割
- それぞれをさらに2分割
- 全てのブロックが1になるまで繰り返す
- 分割完了したら、隣同士のブロックを整列しながら併合
- さらに隣同士をマージ
- 全体が1つになるまで繰り返す
配列のソートアルゴリズムに関しては、いろいろな場所で紹介されている。ただし1次元配列の場合がほとんどで、2次元配列の場合のサンプルコードは見つけられなかった。
そこで1次および2次元配列のマージソートソフトを作成したので、ここに残しておく。
1次元配列のマージソート
2次元配列のマージソート
注意: 元となる2次元配列ar(x, y)のyの要素数はソートするデータ要素数に+1しておくこと
WrapAffine 密なアフィン変換概要 [OpenCV]
入力と種強くフォーアットは画像で、ワープ処理は、これらの画像hピクセルが隙間なく密に詰まっていることを仮定している。これは出力画像が滑らかかつ自然に見えるようにするための補間処理を行うこと。
◆画像処理効果
処理前
処理後
- サイズ変更(0.7)
- 角度変更(-45°) & ボーダーモード変更
BORDER_CONSTANT
BORDER_REPLICATE
BORDER_REFLECT
BORDER_WRAP
以下に制作したWrapAffineクラスのソースを示す。
WrapAffine.h
WrapAffine.cpp
参考サイト
VBオブジェットのnull判定 [VB]
C/C++のつもりで以下のコードを書いたがコンパイルできない。
dim obj as ArrayList
If obj = Nothing Then
Return
End If
いろいろ調べた結果、以下の書式で書くとOKとなることが判明。。。
If obj Is Nothing Then
Return
End If
ちょっとしたことだけど、この程度の違いは言語側で吸収してほしいものだ。何かしら理由があるのでしょうけどね!
CSVファイルを読込みArrayListに保存する [VB]
ArrayListを利用することで、列数の定まっていないファイルの読み込みが可能となる。このソースコードでは列の区切りを “,”固定となっているが、Split(strLine, ",")を書き換えることでスペースやタブ区切りに変更することは容易である。 先に区切り文字を判別する方法もあるが、今回は対応しない。
関数呼び出し側とエラー処理
ReadCsvFile 関数
Dilate モルフォロジー膨張変換概要 [OpenCV]
膨張演算は連結成分(類似した色や輝度を持つピクセルからなる周囲から孤立した大きな領域)を見つける際に使われる。
◆画像処理効果
処理前
処理後(iterations=10)
以下に制作したDilateクラスのソースを示す。
Dilate.h
Dilate.cpp
参考サイト
Erode モルフォロジー収縮変換概要 [OpenCV]
収縮演算は多くの場合、画像内の「スペックル(斑点)」ノイズを削減するのにつかわれる。
◆画像処理効果
処理前
処理後(iterations=10)
以下に制作したErodeクラスのソースを示す。
Erode.h
Erode.cpp
参考サイト
Bilateral Filter バイラテラルフィルタ平滑化概要 [OpenCV]
エッジ保持平滑化という大きなクラスの画像解析用オペレータの一種である。エッジを平滑化しないで画像を平滑化することができる。しかし処理に時間がかかり以下の変換に10秒ちかくかかった。
◆画像処理効果
処理前
処理後
以下に制作したBilateralFilterクラスのソースを示す。
BilateralFilter.h
BilateralFilter.cpp
参考サイト
GaussianBlur ガウシアン平滑化概要 [OpenCV]
最高速ではないが、最も役に立つもの。入力配列内の各点をGaussianカーネルでコンボリューション(畳み込み)し、合計して出力配列を生成する。
◆画像処理効果
処理前
処理後
width方向に平滑化した場合(ksize=29, sigmaX=0)
height方向に平滑化した場合(ksize=29, sigmaY=0)
以下に制作したGaussianBlurクラスのソースを示す。
GaussianBlur.h
GaussianBlur.cpp
参考サイト
MedianBlur メディアン平滑化概要 [OpenCV]
出力画像のそれぞれのピクセルは、それを中心とする正方領域内のピクセルの中心値、または大きさの順に並べた時の真ん中の値(平均ではない)で置き換える。
メディアンフィルタは真ん中の点を選ぶことでアウトライアー(大きく孤立した異常値を持つ点)を無視することができる。
◆画像処理効果
処理前
処理後(aperture=21)
以下に制作したMedianBlurクラスのソースを示す。
MedianBlur.h
MedianBlur.cpp
参考サイト
Blur 単純平滑化概要 [OpenCV]
もっとも簡単なケースで、出力画像のそれぞれのピクセルは、入力画像の対応するピクセルを囲むフィルタウインドウ内の全ピクセルの平均。
◆画像処理効果
処理前
処理後
width方向に平滑化した場合(ksize=29)
height方向に平滑化した場合(ksize=29)
以下に制作したBlurクラスのソースを示す。
Blur.h
Blur.cpp
参考サイト