DICOM 学習:ImageMagick

2017-09-22 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前々回(2017-09-18)の記事「DICOM 学習:.dcm ビューアー」に続いて、・・・・・

導入済みのツール:ImageMagick
ではどうなのか?

参考サイト:Image file formats and compression
で学習して、・・・

バッチ変換ツールconvertを使って変換してみた:
convert  x.dcm  -depth 16  -compress "none"  IM_out16.tif
これで、
x.dcm を入力として、無圧縮の 16bit TIFF IM_out16.tif で出力。

出来ますね。

結果の TIFF ファイルは?
ImageJで読める:
符号無し16bit: 0 ~ 65535!

データの値では、
入力の周辺部分:-2048=30720 が、-1=65535 になる?


だが、
XnViewでは、・・・読み込めたのか? 警告無しで真っ黒!
OpenCVの読み込みコーディングでは、アボート???


本日はここまで。


DICOM 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170819
スポンサーサイト

AMIDE:Free tool for viewing,・・・medical imaging data sets

2017-09-20 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
「DICOM C library」で検索してみた。

“Stack Overflow”の
Reading a dicom file in C」が見つかった。

これの 回答 0 の最初の here ( 2番目の here は リンク切れ )

Free DICOM Viewer
  RTstudents.com
   Radiology for Students and Professionals
に沢山のツールが載っている。

この中から、最初?のモノ:
 AMIDE - (DOS, Macintosh, Windows and Unix) Free tool for viewing,・・・
はどうか?

  AMIDE: Amide's a Medical Imaging Data Examiner


左の
 Installation
   Windows

の、
 Binaries
   amide-VERSION_NUM_install.exe

の最初?の行のDownload amide-1.0.4-1_win32_install.exe (17.9 MB)

つまり、
   1.0.4 2012-11-20

即ち:
「amide-1.0.4-1_win32_install.exe」 17.0MB
を ダウンロードした。

そして、インストール: D:/TOOL/amide/ に。
60.9MBだった。
Path への登録は無し。


立ち上げて、

[File]→[Import File](どっちでも)→<場所>&<ファイル名.dcm>
で、読み込み&表示


[File]→[Export data Set]→[Raw data]→<場所>&<ファイル名.dat>
で、4byte Float バイナリファイル

[File]→[Save As XIF Directory]→<場所>&<ディレクトリ名>
で、中に 2byte UInt ( little endian )のバイナリファイル


これだけ?
些かショボイ・・・(古いことでもあるし)イラナイか?


本日はここまで。


DICOM 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170818

DICOM 学習:.dcm ビューアー

2017-09-18 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
.dcm ファイルを読み込めるツールを探してみた。


ImageJ

  DICOM ファイルを開くには、
 「File」→「Open」→ <ファイル選択>
   拡張子(.dcm)は付いていなくても可
  ※ ドラッグ&ドロップでも開ける

 TIFF で書き出せる:
 「File」→「Save As」→「Tiff...」→ <ファイル名入力>
 ※ 16bit の DICOM ファイルなら、16bit TIFF で保存される。
  little エンディアン でも読めて、big エンディアンで出力。
  ( 無圧縮 )
  このTIFFは、OpenCV で読める(変換してくれている?)


XnView

 読み込み、表示出来る。(“16bit を 8bit 化する”警告表示無し )

 TIFF で書き出せるが、8bit 。
  ( 無圧縮 )


OpenCV

  「DICOM and OpenCV
  →
  C++ and dicom? I would recommend DCMTK.
  Efficient, solid, raliable and open source.



本日はここまで。


DICOM 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170817

DICOM 学習:Pydicom

2017-09-15 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
「DICOM Python」と検索してみたら、・・・

“Qiita”のPythonでDICOM画像をなんとかする
とか
“XTREME ~”の[Pydicom] Pythonで医用画像(DICOM)を簡単に扱う(1)
が見つかる。

なので、“Pydicom”を使ってみようと思った。

Gohlkeさんのページ」にあった。


「pydicom-0.9.9-py2-none-any.whl」 2014-11-23 付  456KB
をダウンロードした。

“.whl”ファイルは単なる ZIP アーカイブですネ。

なので、Explzhで開いて「dicom」フォルダ以下を、
~/WinPython32_2763/python-2.7.6/Lib/site-packages/ に格納した。


これで、
“XTREME ~”のページにある如く。

  うまくインストールできたか、pythonの対話モードで試してみます。
   >>> import dicom
  とし、エラーが出なければOKです。

やってみた
DOS 窓で、

 > python

 >>> import dicom

OKですね。


で、ドキュメントは:
pydicom documentation
でしょうか?


1本作ってみた:
##### test_DICOM_read.py
# coding: UTF-8
import dicom

ds=dicom.read_file( 'x.dcm' )
M=ds.pixel_array

for y in range(512):
for x in range(512):
if M[y,x]==1965:
print y,x ##### 484 310
これで、
一応使えた。


これは簡単/シンプルですネ。


本日はここまで。


DICOM 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170817

DICOM 学習:ファイル読み込み

2017-09-13 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-09-11)の記事「DICOM 学習:初め?」で書いた、
c#: how to read parts of a file? (DICOM)」の
回答 11 のコードを真似て
何とか読み込みできるものを作った:
----- DICOM_Read.gsl -----
SF = string.format
int16 = |x| ffi.cast( 'int16_t*', x )
uint16 = |x| ffi.cast( 'uint16_t*', x )
uint32 = |x| ffi.cast( 'uint32_t*', x )

ReadUInt16 = || uint16( IN:read(2) )[0]
ReadUInt32 = || uint32( IN:read(4) )[0]
ReadChars = |n| IN:read(n)

IN = io.open( 'x.dcm', 'rb' ) ----- サンプルデータ -----

-- 先頭 128 バイトは Preamble ( all ゼロ )
-- 次の4バイトは:'DICM'

zzz = IN:read(128); fid = IN:read(4)
if fid ~= 'DICM' then
print( 'Not a DICM' ); _=io.read(1); os.exit()
end

----------------------- 参考サイトの C# コードから・・・・・
g = ReadUInt16()
while g == 2 do
e = ReadUInt16();
vr = ReadChars(2)
if vr == 'AE' or vr == 'AS' or vr == 'AT' or vr == 'CS' or
vr == 'DA' or vr == 'DS' or vr == 'DT' or vr == 'FL' or
vr == 'FD' or vr == 'IS' or vr == 'LO' or vr == 'PN' or
vr == 'SH' or vr == 'SL' or vr == 'SS' or vr == 'ST' or
vr == 'TM' or vr == 'UI' or vr == 'UL' or vr == 'US'
then
length = ReadUInt16()
else -- Read the reserved byte
_ = ReadUInt16()
length = ReadUInt32()
end
----- print( g, e, vr, length, SF('%X',IN:seek()) ) -- デバッグ用
val = ReadChars(length)
g = ReadUInt16()
end

----------------------- 以下部分を追加

while g==8 or g==16 or g==24 or g==32 or g==40 or g==64 or g==28677 do
e = ReadUInt16();
length = ReadUInt32()
----- print( g, e, vr, length, SF('%X',IN:seek()) ) -- デバッグ用
val = ReadChars(length)

--------------------
if g==40 then
if e== 16 then print( uint16(val)[0], '=xx' ) end -- 512
if e== 17 then print( uint16(val)[0], '=yy' ) end -- 512
if e==256 then print( uint16(val)[0], '=bpp' ) end -- 16
if e==257 then print( uint16(val)[0], '=msb' ) end -- 16
if e==258 then print( uint16(val)[0], '=hib' ) end -- 15
end
--------------------

g = ReadUInt16()
end


val = ReadChars(6) ----- この6バイト分は不明?

----------
print( SF('%X',IN:seek()) ) ----- 0x09A2 = 2466

----------
val = IN:read(512*512*2)
D = int16( val )

Mx, Mn = 0, 256*256
for n=0,512*512-1 do v=D[n]
if v>Mx then Mx=v end
if vend

print( Mx, Mn ) ----- 1965, -2048
これで、・・・・・


これで、.dcmファイルを読み込める???
そこそこ汎用で???


補足:
  値データは、符号付き16ビット?
  「DICOM ファイルからのイメージ データの読み取り

  .dcm ファイルのデフォルトは、リトルエンディアン?
  「DICOMファイルフォーマットの概要
  タグからは、エンディアンの判定は不能?



本日はここまで。


DICOM 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170817

DICOM 学習:初め?

2017-09-11 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
ひょんなことから、拡張子が '.dcm' なるファイルを扱うことになった。

これって、
.DCM ファイル拡張子

  読めない、または表示できない dcm ファイルはありませんか?
  dcm の開き方については下記の手順を参照してください。
  dcm ファイルの表示できる・または開けるソフトが利用可能な場合、
  対応ソフトのセクションで検索ができます。
  その後 DICOM Image File を開くフリープログラムの・・・

  .DCMはDICOMの略で、
  正式にはDigital Imaging and Communications in Medicineという。
  この画像ファイル形式はNEMAに開発された。
  NEMAはNational Electrical Manufacturers Associationのこと。

ですね。


詳しいことは別にして、
<紙>流でぶつかってみた。


取り敢えず、1枚(1ファイル):512x512画像。

先ずは、バイナリエディタで開いてみた。

先頭 0x09A2 = 2466 バイトの(ヘッダ?)情報があって、
512x512x2 バイトでデータがある。

“リトルエンディアン”としてみる。

符号付きと見ると、
0xF800 = -2048 から、0x07AD = 1965
の間の値の様ダ。


でも、
多分先頭の情報部分のサイズはモノによる?
また、
“ビッグエンディアン”のモノもある?


何か汎用のものは無いか?探してみた。

C# だけど、
c#: how to read parts of a file? (DICOM)
が見つかった。

回答 11 に、
  Something like this should read the file,
  its basic and doesn't handle all cases,
  but it would be a starting point:
=== Google 翻訳:
  このようなものは、基本的なファイルを読み、
  すべてのケースを処理するわけではありませんが、
  出発点になります。


これで、
<紙>流コーディングか?


さらに、フォーマット説明では:
DICOM Specification Overview: Table of Contents
でしょうか?


頑張って学習ダ。


本日はここまで。


DICOM 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170815

OpenCV 学習:cvSolve

2017-09-08 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
Tech Noteサイトの
OpenCV - 数学演算」を見つけた。

  ここでは,画像処理に必
  内容を載せていきます.

  ・ 行列演算 (Matrix op
    ・ &color(blue){Cv
    ・ 行列の生成
    ・ 行列演算
  ・ 幾何学変換 (Geometr
    ・ 拡大・縮小
    ・ 回転
    ・ 平行移動
    ・ アフィン変換 (A
  ・ 統計 (Statistics)
    ・ 最小・最大値
    ・ 平均・標準偏差

と云うことで、若干学習した。


昨年2月(2016-02-02)の記事「GSL Shell 学習:matrix.solve( A, b )
で書いた、3変数の連立方程式を解いてみた。

----- test_cvSolve.gsl -----
require'cv2_a'

----------- 係数行列 と、右辺ベクトル データ:
A = matrix.def{ { 0, 3, 6 }, { 1, 4, 7 }, { 2, 5, 9 } }
b = matrix.vec{ 1, 0, -2 }

---------- OpenCV の CvMat 型
M = cv2.cvCreateMatHeader( 3, 3, CV_64FC1 )
cv2.cvSetData( M, A.data, 3*8 ) -- 第3引数: step -

B = cv2.cvCreateMatHeader( 3, 1, CV_64FC1 )
cv2.cvSetData( B, b.data, 1*8 ) -- 第3引数: Full row length in bytes

X = cv2.cvCreateMat( 3, 1, CV_64FC1 ) -- 答え(解)ベクトル

-------------------------------------------------------------
Ret = cv2.cvSolve( M, B, X, 0 ) -- 第3引数: method

for r=0,2 do print( X.Dbl[r] ) end -- 確認
これで?

以前のブログと同じ値が得られた。


なお、solution (matrix inversion) method
については、
・ DECOMP_LU     0
・ DECOMP_SVD     1
・ DECOMP_EIG     2
・ DECOMP_CHOLESKY 3
・ DECOMP_QR     4
・ DECOMP_NORMAL  16
ですね。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170813

OpenCV 学習:CvMat 型のヒストグラム機能は無し

2017-09-06 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
ヒストグラムについては、7月(2017-07-03)の記事:
GSL Shell 学習:ヒストグラム(改)
で纏めているが、・・・・・

これに対抗して、
OpenCV でもやりたい。

OpenCV 2.4.13.3 documentationの、
OpenCV API Reference」を、histogramで検索してみた。

結果:「histogram

で、

C function では、

void cvCalcHist( IplImage** image, CvHistogram* hist, ・・・ )

でしょうか?

CvMat 型は、見つからない。

しかも、二重ポインタ指定!


残念ながら、IplImage 型のみならば却下。


ヒストグラム処理については、
GSL - GNU Scientific Library
で対処する。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170724

GSL Shell 学習:LuaJIT は2つのみで可

2017-09-01 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
インタプリタ系言語の中で、
<紙>が心酔しているのは、GSL Shell だが、・・・

インストール(展開)場所: D:/TOOL/Lua/gsl-shell/
には、
luajit.exe と、lua51.dll がある。

この2つダケで、
GSL の機能は含まれないが FFI 機能を含んでいる、
基本 Lua の JIT インタプリタと成る
のではないか?
と思った。


常用のマシンで隔離した環境、
つまり VM マシンで、
何処かに、この2つのファイルを格納し、
その場所で、コマンドプロンプトで
  luajit -v
と打ち込めば、
立ち上がり
  LuaJIT 2.0.2 -- ・・・
と表示される。


何某かの Lua プログラム( a.lua )を作って、
  luajit a.lua
とすれば実行された。

つまり、LuaJIT は2つのみで可ダ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170315

OpenCV 学習:GrayScale 画像の2値化

2017-08-30 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
先日(2017-08-07)の記事「OpenCV 学習:CvMat型学習サイト」で書いたが、・・・

「OpenCV.jp」の「OpenCV-CookBook」サイトに、

画像処理」のページがあり、
その中に、「画像を2値化する」がある。

  画素値を閾値処理して,画像の2値化を行います.
  閾値処理の手法には,以下のものがあります:

   ・THRESH_BINARY:閾値以下の値は0に,
        それ以外は指定した値(maxVal)になります.
   ・THRESH_BINARY_INV:上記とは逆に,閾値より大きい値が0に,
        それ以外は指定した値(maxVal)になります.
   ・THRESH_TRUNC:閾値より大きい値は閾値まで切り詰められ,
        それ以外はそのまま残ります.
   ・THRESH_TOZERO:閾値より大きい値はそのまま残り,
        それ以外は0になります.
   ・THRESH_TOZERO_INV:上記とは逆に,閾値以下の値はそのまま残り,
        それ以外は0になります.

  さらに,特殊な値 THRESH_OTSU を,
    上述のものと組み合わせて使うこともできます.
  この場合,関数は大津のアルゴリズムを用いて最適な閾値を決定し,
  それを引数 thresh で指定された値の代わりに利用します.
  つまり,自分で閾値を決める必要がありません.

  また, adaptiveThreshold は適応的な閾値処理を行います.・・・
  ・・・・・
  ・・・・・

C 言語用関数は;
double cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type )
ですネ。

ここで、
最初の5つの手法に対するコード値は、順に 0, 1, 2, 3, 4 の様です。


そして、
特殊な値 THRESH_OTSU は、8 でしょうか。

この手法に関する過去記事は:

2年前(2015-02-23)の記事「Python/OpenCV 学習:大津の2値化

2年前(2015-03-30)の記事「ImageJ プラグイン:大津の2値化


今では、Lua ( GSL Shell ) / OpenCV なので、

以前(2017-08-14)の記事「GSL Shell 学習:“cv2_a.lua”モジュール?」で書いた、
“cv2_a.lua”を使ってコーディングしてみた。

指定固定値では:
----- test_Threshold.gsl -----
require'cv2_a'

img = cv2.cvLoadImageM( 'sample.tif', 0 ) -- CV_8UC1 タイプで入力

Bim = cv2.cvCloneMat( img ) -- 出力領域

Ret = cv2.cvThreshold( img, Bim, 128, 255, 1 ) -- 128 以下は 255 で、超だと 0
print( Ret ) -- これは、指定した値 = 128

cv2.cvSaveImage( 'Threshold.tif', Bim, 0 )
そして、大津さんのアルゴリズム適用は:
----- test_Otsu_Bin.gsl -----
require'cv2_a'

img = cv2.cvLoadImageM( 'sample.tif', 0 ) -- CV_8UC1 タイプで入力

Bim = cv2.cvCloneMat( img ) -- 出力領域

Ret = cv2.cvThreshold( img, Bim, 0, 255, 1+8 ) -- X 以下は 255 で、超だと 0
print( Ret ) -- これは、大津さんが決めた値 = X

cv2.cvSaveImage( 'Otsu_Bin.tif', Bim, 0 )
ですね。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170722(0607)

“DLL”ファイルから“DEF”ファイルを作る

2017-08-28 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
以前(2017-08-16)の記事「GSL 学習:“gsl_a.lua”モジュール?」では、
  ・・・・・
  ・・・・・
  “GSL Shell”が包含しているDLL“libgsl-0.dll”に就いても・・・
  ・・・・・
  ・・・・・
と書いている。

このDLL“libgsl-0.dll”に含まれる関数の一覧を確認してみた。


その為には、tiny_impdefを使えば出来る?

5月(2017-05-06)の記事「tcc 学習:lua52.dll 利用その他」で、
  ・・・・・
  ・・・・・
  学習した手順通り:
tiny_impdef  lua52.dll
  で、“lua52.def”が出来た。
  ・・・・・
  ・・・・・
と書いている。


やってみた:
tiny_impdef  libgsl-0.dll
で、“libgsl-0.def”が出来た。

このファイルで確認出来る。



それでは、
以前(XXX)の記事「GSL Shell 学習:“cv2_a.lua”モジュール?」で作った、
“cv2_a.lua”で定義している関数が、
“OpenCV”のDLL“opencv_world300.dll”に含まれているか?
確認したい。

その為には、
DLL“opencv_world300.dll”ファイルから“DEF”ファイルを作る???

だが、tiny_impdef はこの種の DLL ファイルには対応していない!!!

そこで、何か無いか探してみたら、

古い記事(投稿日:2013年4月15日)だが、
dllに含まれる関数の一覧を取得する。
が見つかった。

dumpbinツールですね。

<紙>の場合は、
  C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin/
にあった。

で、使ってみた:
dumpbin  /exports  opencv_world300.dll  >CV_300.txt
これで、一旦 CV_300.txt ファイルを作り、
不要な行や各行の不要部分を削除して“opencv_world300.def”を作った。



本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170703

OpenCV 学習:cvCopy で 型変換

2017-08-26 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
“OpenCV”の C 関数:
CvMat* cvCloneMat( const CvMat* mat ); は、

  Creates a full matrix copy.

と云うことですね。

なので、
  img2 = cv2.cvCloneMat( img )
とすれば、
既存のimg から、そっくりなimg2ができる。

一方で、今回学習した、C 関数:
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask ); は、

  Copies one array to another.

と云うことですね。

これでは、
既存のimg から、適切に領域を用意したimg2にコピーできる。

これだと、データ型の変換
 ・CvMat 型 → IplImage 型
 ・IplImage 型 → CvMat 型
に使える?

それで、1本コーディングしてみた:
----- conv_mat-Ipl.gsl -----
require'cv2_a'

fnam = 'test.tif' ----- テスト画像:2行5列

Timg = cv2.cvCreateMat( 2, 5, CV_8UC1 )
T = { 10, 30, 50, 70, 90, 110, 130, 150, 170, 190 }
for n=0,9 do Timg.Byte[n]=T[n+1] end
cv2.cvSaveImage( fnam, Timg, 0 )

--============================================
---------- IplImage 型 → CvMat 型

----- (1) IplImage 型で読込:
Iimg = cv2.cvLoadImage( fnam, 0 )
p = ffi.cast( 'uint8_t*', Iimg.data )
print( p[1*5+4], p[1*8+4] ) -- 2行目の5列目:正しくは 4 バイト境界

----- (2) CvMat 型領域確保 & コピー(変換):
Mimg = cv2.cvCreateMat( Iimg.yy, Iimg.xx, CV_8UC1 )
cv2.cvCopy( Iimg, Mimg, NULL )
print( Mimg.Byte[1*5+4] ) -- 2行目の5列目

--============================================
---------- CvMat 型 → IplImage 型

----- (1) CvMat 型で読込:
Nimg = cv2.cvLoadImageM( fnam, 0 )
print( Nimg.Byte[1*5+4] ) -- 2行目の5列目

----- (2) IplImage 型領域確保 & コピー(変換):
SZ = ffi.new( 'CvSize', Nimg.xx, Nimg.yy )
Oimg = cv2.cvCreateImage( SZ, 8, 1 )
-- int depth, int channels
cv2.cvCopy( Nimg, Oimg, NULL )
q = ffi.cast( 'uint8_t*', Oimg.data )
print( q[1*5+4], q[1*8+4] ) -- 2行目の5列目:正しくは 4 バイト境界
と云うことで???

出来ました。


IplImage 型が好きになれないのは、
行毎に、4バイト境界にアラインされるから。


因みに、
'cv2_a.lua' 内で2つのデータ型の定義は以下:
--  構造体の定義:
ffi.cdef[[
typedef struct CvMat{
int type; int step; int* refcount; int hdr_refcount;
union{ unsigned char* Byte; char* Char;
unsigned short* Word; int* Int; double* Dbl; };
union{ int rows; int height; int yy; };
union{ int cols; int width; int xx; };
} CvMat;

typedef struct _IplImage{
int nSize; int ID; int nChannels;
int alphaChannel; int depth;
char colorModel[4]; char channelSeq[4];
int dataOrder; int origin; int align;
union{ int cols; int width; int xx; };
union{ int rows; int height; int yy; };
struct _IplROI *roi; struct _IplImage* maskROI;
void* imageId; struct _IplTileInfo *tileInfo;
int imageSize; union{ void* data; char* imageData; };
int widthStep;
int BorderMode[4]; int BorderConst[4];
char* imageDataOrigin;
} IplImage;
]]
と云った感じ。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170723

OpenCV 学習:CvMat 型のソート機能は無し

2017-08-25 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-08-23)の記事「GSL 学習:配列要素の並び替え」に対抗して、
OpenCV でもやりたい。

OpenCV 2.4.13.2 documentationの、
OpenCV API Reference」を、sortで検索してみた。


cv2.sort (Python function, ・・・)

void sort( ・・・・・ ) (C++ function, ・・・)

などなど。

で、

C function では、

void cvSeqSort( CvSeq* seq, CvCmpFunc func, void* userdata )

schar* cvSeqSearch( CvSeq* seq, const void* elem, ・・・ )

しか見つからない。


残念ながら、CvSeq 型では却下。


並び替え(ソート)については、
GSL - GNU Scientific Library
で対処する。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170717

GSL 学習:配列要素の並び替え

2017-08-23 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
“GSL - GNU Scientific Library”のドキュメント:
GSL Reference Manual - HTML」には、Sorting の章がある。
しかし、
  Sorting objects
には、以下様な記述がある。

  The following function provides a simple alternative
  to the standard library function qsort().
  It is intended for systems lacking qsort(), not as a replacement for it.
  The function qsort() should be used whenever possible,
  as it will be faster and can provide stable ordering of equal elements.
  Documentation for qsort() is available in
   the GNU C Library Reference Manual.
===(Google翻訳)
  次の関数は、標準ライブラリ関数qsort()に代わる簡単な方法を提供します。
  これは、qsort()が不足しているシステムを対象としたものであり、
  qsort()の代わりとはなりません。
  可能な限りqsort()関数を使用する必要があります。
  これは、より速く、同等の要素の安定した順序付けを提供できるからです。
  qsort()のドキュメントは、
   GNU Cライブラリリファレンスマニュアルにあります。

そういえば、
昨年5月(2016-05-16)の記事「Lua で、クイックソート“qsort”」で、

  ・・・・・
  ・・・・・
  そうならば、と、真似をしてコード化してみた。
  ・・・・・
  でも、実行したところ、
  比較判定関数(コールバック関数?) の終盤でアボート???

  原因究明に至らなかったので、
  その昔、2008年初め?、それ以前(?)から使っていた「ActiveBASIC
  でコード化したモノ。
  それは、
  「ab.com コミュニティ ・ トピック - ソートロジック大会
  にあるものを頂いていた。
  これを、Lua に移植した:
  ・・・・・
  ・・・・・
  「GSL - GNU Scientific Library
  にも、
  「void gsl_sort_vector(gsl_vector* v)」や、
  void gsl_sort_index(size_t* p, const double* data, size_t stride, size_t n)
  があるが、
  これは、実数型データの昇順ソートですネ。
  ・・・・・
  ・・・・・

と書いていた。


'gsl_a.lua' サブプログラムを作ったことだし、
今回、使ってみることにした。

 ・gsl_heapsort
 ・gsl_heapsort_index
 ・gsl_sort
 ・gsl_sort_index

等々、幾つか関数があるが、何れも昇順のみ?


クイックソートで、
2種類:
gsl_sort
  double 型データ、in-place ソート
と、
gsl_sort_long_index
  int32 型データ、index ソート
を試した:
----- gsl_Sorting.gsl -----
require'gsl_a'

----- in-place ソート
V = matrix.vec { 5, 4, 3, 2, 1 }
gsl.gsl_sort( V.data, 1, #V ) -- ソート実行(破壊更新)
print( V[1], V[2], V[3], V[4], V[5] ) -- 結果確認


----- index ソート
V = ffi.new( 'int32_t[5]', 5, 4, 3, 2, 1 )
P = ffi.new( 'int32_t[5]' )
gsl.gsl_sort_long_index( P, V, 1, 5 ) -- index ソート実行
-- 結果確認
print( P[0], P[1], P[2], P[3], P[4] )
print( V[P[0]], V[P[1]], V[P[2]], V[P[3]], V[P[4]] )
これで?

出来ました。


本日はここまで。


Lua ( GSL Shell ) / GSL 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170717+

OpenCV 学習:cvReduce

2017-08-21 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
OpenCV.jp : OpenCV逆引きリファレンス」を見ていたら、・・・


 cv::Matの列/行毎の合計,平均値,最小,最大値を求める

 例えば,
 1行が1つの特徴ベクトルである行列(行数は特徴ベクトルの個数)があるとして,
 それらのベクトルの平均を求めるにはどうすれば良いでしょうか.
 1行1行足し合わせて個数で割ることも出来ますが, reduce メソッドを用いると,
 行列の行毎(または列毎)の,合計値や平均値などを簡単に計算できます.


とあった。

つまり、
void cvReduce( ・・・ )
  Reduces a matrix to a vector.
void cvReduce( const CvArr* src, CvArr* dst, int dim=-1, int op=CV_REDUCE_SUM );
// dim - dimension index along which the matrix is reduced.
// 0 means that the matrix is reduced to a single row.
// 1 means that the matrix is reduced to a single column.

// CV_REDUCE_SUM: sum of all rows/columns of the matrix.
// CV_REDUCE_AVG: mean vector of all rows/columns of the matrix.
// CV_REDUCE_MAX: maximum (column/row-wise) of all rows/columns of the matrix.
// CV_REDUCE_MIN: minimum (column/row-wise) of all rows/columns of the matrix.
と云うこと。


そこで、テストしてみた:
----- cvReduce.gsl -----
require'cv2_a'

--- 3行4列マトリックス
M = cv2.cvCreateMat( 3, 4, CV_64FC1 )
T = { 0.2, 4, -0.5, 1 , 1.1, 0, 3.0, -3 , 1.2, -5, 0, 2 }
for n=0,11 do M.Dbl[n]=T[n+1] end

--- 3行1列マトリックス
N = cv2.cvCreateMat( 3, 1, 6 )

cv2.cvReduce( M, N, 1, 0 ) -- 1列化、CV_REDUCE_SUM

print( N.Dbl[0], N.Dbl[1], N.Dbl[2] ) -- 行毎の和
と云った方法もある。


本日はここまで。


Lua ( GSL Shell ) / OpenCV 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170712
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
08 | 2017/09 | 10
- - - - - 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク