Lua 学習:math.deg、math.rad

2017-12-08 :  PCクリニック
ひょんなことから、
Lua 5.2 リファレンスマニュアル”に、
math.degmath.rad が載っている事に、今更ながら気が付いた。


これまでは、

三角関数 : math.sinmath.cos、・・・

逆三角関数 : math.asinmath.atan2、・・・

ばかりに、注目していたようダ。



それで、
最初に書いた2つの関数は、
角度の表現形式を変換するものですネ。

math.deg( math.pi ) --> 180

math.rad( 180 ) --> 3.1415926535898


この様な、
一見煩わしい事に対する関数は
効果的に使って行こう。


本日はここまで。


Lua 学習は続く。


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


171102

GSL 学習:“gsl_b.lua”モジュール?

2017-12-06 :  PCクリニック
8月(2017-08-16)の記事「GSL 学習:“gsl_a.lua”モジュール?」では、
  ・・・・・
  ・・・・・
  そして、取り敢えずdouble版と、long版について、
  一部、計 16 ヘッダーファイルを取り込んだ。
  「gsl_block_double.h」「gsl_block_double_long.h」「gsl_histogram.h」
  「gsl_histogram2d.h」「gsl_interp.h」「gsl_permute_double.h」
  「gsl_permute_long.h」「gsl_sort_double.h」「gsl_sort_long.h」
  「gsl_statistics_double.h」「gsl_statistics_long.h」「gsl_spline.h」
  「gsl_matrix_double.h」「gsl_matrix_long.h」「gsl_vector_double.h」
  「gsl_vector_long.h」

  これらのファイルから“構造体”と“関数”の定義を抜き出した。
  ・・・・・
  ・・・・・

そして、
“gsl_a.lua”モジュールもどきを作った。


今回、
それらに加えて、
uchar版と、ushort版にも対応すべく、
機能拡張を行った。

前回と同じ gsl-1.9.tar.gzから、
一部、計 12 ヘッダーファイルを取り込んだ。
 「gsl_block_uchar.h」「gsl_permute_vector_uchar.h」「gsl_sort_uchar.h」
 「gsl_statistics_uchar.h」「gsl_matrix_uchar.h」「gsl_vector_uchar.h」
 「gsl_block_ushort.h」「gsl_permute_vector_ushort.h」「gsl_sort_ushort.h」
 「gsl_statistics_ushort.h」「gsl_matrix_ushort.h」「gsl_vector_ushort.h」

これらのファイルから(“構造体”と)“関数”の定義を抜き出し、
「gsl_cdef_Func_uchar.lua」と「gsl_cdef_Func_uchort.lua」を作った。
(専用スクリプトを作成して実行)

この2ファイルを併合して
「gsl_cdef_Func_uchar_ushort.lua」を作り、
前回と同様に、過不足チェックを行った。

不足する“構造体”等の定義:
----- gsl_cdef_Struct_uchar_ushort.lua -----
ffi.cdef[[

typedef unsigned char uchar;
typedef unsigned short ushort;

typedef struct { size_t size1; size_t size2; size_t tda;
uchar * data;
gsl_block * block; int owner;
} gsl_matrix_uchar;

typedef struct { size_t size; size_t stride;
uchar * data;
gsl_block *block; int owner;
} gsl_vector_uchar;

typedef struct { size_t size1; size_t size2; size_t tda;
ushort * data;
gsl_block * block; int owner;
} gsl_matrix_ushort;

typedef struct { size_t size; size_t stride;
ushort * data;
gsl_block *block; int owner;
} gsl_vector_ushort;


typedef gsl_vector_uchar _gsl_vector_uchar_view;
typedef gsl_vector_uchar _gsl_vector_uchar_const_view;

typedef gsl_vector_ushort _gsl_vector_ushort_view;
typedef gsl_vector_ushort _gsl_vector_ushort_const_view;

]]
を作った。


最後に、
「gsl_cdef_Func_uchar_ushort.lua」と「gsl_cdef_Struct_uchar_ushort.lua」
の2ファイルを集めて、「gsl_b.lua」とした。

ここで、
以前の“gsl_a.lua”は 内部で呼び出すことにした。


これで、従来の

  require'gsl_a'

は継続して使え、

  require'gsl_b'

とすることも可能である。


さらに、

  require'gsl_b'

  M = ffi.new('uchar[6]', 2, 20, 5, 11, 0, 4 )
  k = gsl.gsl_stats_uchar_max_index( M, 1, 6 )

も使える。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171103

Lua ドキュメント・サイト(改)

2017-12-04 :  PCクリニック
前(2017-12-01)の記事「GSL Shell コード・テンプレート(改)」に
対応して、・・・・・
昨年3月(2016-03-28)の記事「GSL Shell 学習:Lua ドキュメント・サイト」の
内容を見直した。


言語仕様:

GSL Shell 2.3.1 documentation

LuaJIT / Extensions

Lua 5.2 リファレンスマニュアル



ガイドブック:

Learn Lua in 15 Minutes

Programming in Lua (first edition)

Lua Tutorial

Hyperpolyglot / Perl, Lua

Lua 5.1 言語仕様メモ - Qiita



モジュール別:

Penlight Lua Libraries 1.5.4

Microlight - a very compact Lua utilities module

LuaFileSystem ( Luapower )

time ( Luapower )

OpenCV 2.4.13.4 / API Reference

GSL Reference Manual / GNU Scientific Library

gnuplotスクリプトの解説

IUP:Portable User Interface

afxLua - MS Windows API Library

Tiny C Compiler 0.9.26 binding for LuaJIT



本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171105,20

GSL Shell コード・テンプレート(改)

2017-12-01 :  PCクリニック
先月下旬(2017-11-22)の記事「Microlight - a very compact Lua utilities module」と、
その後(2017-11-27)の記事「Microlight 学習:split 関数
に対応して、
先月初め(2017-11-08)の記事「GSL Shell コード・テンプレート」で書いた、
Code Template「Code_Template.gsl」を改訂した。


プログラム「Code_Template_Rev.gsl」:
----- Code_Template.gsl     <== プログラムの名前

--[[
   プログラムの仕様・コメント 等々

  プログラム・ファイルのコード:'Shift-JIS'

  コマンドライン引数:
   arg 引数リスト    #arg 引数の個数
arg[0] 当プログラム名

]]
--======================
require'cv2_a' -- 'OpenCV' 使用: cv2.cvLoadImageM 等々
require'gsl_a' -- 'GSL' 使用: gsl.gsl_rng_get 等々
gp = require'gnuplot' -- 'gnuplot' 使用: gp.Plot 等々
require'pl' -- 'Penlight'使用: path.currentdir 等々
require'ml'.import() -- 'Microlight' : split、range 等々?

require'winman' -- 'afxLua/winman'使用: winman.send 等々
Iup = require'IUP' -- 'IUP' 使用: Iup.Open 等々

lfs = require'lfs' -- 'LFS' 使用: lfs.attributes 等々
--- 'Penlight' 経由で 'lfs' を使いたいなら
_ = path.currentdir()

--==================================
-- use'math' -- 'math.log' を 'log' と モジュール名の省略
-- use'bit' -- 'bit.band' を 'band' ※  これは使用注意

f = |x| x^2 - 1 --=== function f(x) return x^2-1 end

--==================================

----- ディレクトリ内ファイル一覧取得:
require'pl'
f_list = dir.getfiles( Dir )


----- ファイル(不)存在チェック:
require'afx'
if not afx.fileexists( f ) then
-- ~
end


-- D&D でファイル名取得:
require'pl'
Dir, Fname = path.splitpath( arg[1] )
lfs.chdir( Dir ) -- これ必要?


----- 入力テキストファイルについて、
-- ファイル全体を一括で(文字列として)読み込む:
require'pl'
wstr = file.read( 'hoge.txt' )
----- 又は、
require'ml'.import()
wstr = readfile( 'hoge.txt' )

-- ファイル全体を行毎の文字列配列で読み込む:
require'pl'
w = utils.readlines( 'hoge.txt' )
-- 更に、一行分を分割(空白区切り):
v = stringx.split(w[i])
----- 又は、
require'ml'.import()
v = split(w[i])


-- CSVファイル全体をテーブルとして読み込む:
t = csv.read( 'hoge.csv' )
-- 更に、数値のみなら行列に変換:
m = matrix.def( t )
----- 非数値データの行(テーブル要素)を除くには:
table.remove( t, 1 ) -- とかで。

----- 入力バイナリファイルについて、
-- ファイル全体を4バイト整数配列として読み込む:
IN=io.open('hoge','rb'); buf=IN:read('*a'); IN:close()
pt=ffi.cast('int32_t*',buf)


----- 出力テキストファイルについて、
-- 'fprintf' で書き出し:
require'pl'; OT=io.open('f.txt','w')
utils.fprintf( OT, ' %g %d %s\n' , floatv, intv, str )
OT:close()

--===============================
----- 文字列が数値を表すか?判定
if tonumber( str ) ~= nil then
-- ~
end

--===============================

----- Python の 'range'
require'pl'

for k in seq.range( 0, n-1 ) do -- for k in range( n ) :
-- ~ -- # ~
end -- # 無し

for k in seq.range( i, j-1 ) do -- for k in range( i, j ) :
-- ~ -- # ~
end -- # 無し

----- 又は、
require'ml'.import()
for k in range( 0, n-1 ) do
-- ~
end


plc = require'pl.comprehension'.new()
T = plc('x for x=1,5')() -- T は { 1, 2, 3, 4, 5 }
--- plc 'x for x=1,5' () -- これでも可
V = matrix.vec( plc'x for x=1,5'() ) -- これで 'matrix'ベクトル


--===============================
----- 三角関数 逆三角関数
-- sin、cos、tan、・・・・・ asin、acos、atan、atan2
------------------ rad、deg

----- 特殊関数
-- sf.fact(n) ・・・ 階乗(factorial) n!
-- sf.gamma(x)・・・ ガンマ関数(gamma function)
-- x は正数。 use:real Lanczos method ( ランチョス法 )


--===============================
--[[ ----- 過去記事/備忘録 -----

備忘録:(2017-04-08)記事
「Lua 言語仕様:備忘録(忘れやすい事)4言語対比表」
 http://jn1inl.blog77.fc2.com/blog-entry-2523.html
「H29-03-04_Lua言語仕様_備忘録.html」H29-03-22 /_GSL/

関数フィッティング:(2017-04-05)記事
「GSL Shell 学習:Fitting サブ(改)」
 http://jn1inl.blog77.fc2.com/blog-entry-2521.html
「SUB_GSL_Fit.lua」H28-02-04 /_GSL/H28-12-10_FitGSL/

非線形1変数方程式の求解:(2017-06-21)記事
「GSL Shell:非線形1変数方程式の求解モジュール自作」
 http://jn1inl.blog77.fc2.com/blog-entry-2569.html
「NL_1var_Rev.gsl」H28-05-07 /_GSL_tcc/H29-05-06_Solve_Newton/

非線形2変数方程式の求解:(2017-06-24)記事
「GSL Shell:非線形2変数方程式の求解モジュール自作」
 http://jn1inl.blog77.fc2.com/blog-entry-2571.html
「NL_2var_Rev2.gsl」H28-05-11 /_GSL_tcc/H29-05-06_Solve_Newton/

スプライン補間:(2016-09-19)記事
「GSL Shell 学習:スプライン補間」
 http://jn1inl.blog77.fc2.com/blog-entry-2404.html
「GDT_Spline.gsl」H28-08-12 /_GSL/H28-08-12_Spline/

'OpenCV' サンプルコード:(2017-07-30)記事
「OpenCV:cvFindContours 正常に出来た」
 http://jn1inl.blog77.fc2.com/blog-entry-2592.html
「cvFitEllipse2_7.gsl」H29-06-28 /_GSL_CV/H29-06-27_FindContours_FitEllipse2/

'GSL' サンプルコード:(2017-08-23)記事
「GSL 学習:配列要素の並び替え」
 http://jn1inl.blog77.fc2.com/blog-entry-2605.html
「gsl_sort.gsl」H29-07-17 /_GSL_gslib/H29-07-17_Sorting/

'gnuplot' 用モジュール定義:(2017-11-06)記事
「Lua & gnuplot:gnuplot モジュール改訂2」
 http://jn1inl.blog77.fc2.com/blog-entry-2638.html
「gnuplot.lua」H29-06-20 /_gnuplot/H29-06-20_gp_lua/

'IUP' サンプルコード:(2017-02-12)記事
「IUP で GUI アプリ:コード改訂」
 http://jn1inl.blog77.fc2.com/blog-entry-2486.html
「IUP_Exact_Dbl_Entou_Rev.gsl」H29-01-18 /_GSL/H29-01-18_IUP_3/

'afxLua' サンプルコード:'afx'、'cio'、'clipboard'、'winman'、'winreg'
検索「afxLua」
 http://jn1inl.blog77.fc2.com/?q=afxLua
]]
今回は、こんなところ?


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171120

Lua 学習:文字列分割3法

2017-11-29 :  PCクリニック
Lua ( GSL Shell ) において、
文字列分割については、・・・・・

昨年3月(2016-03-12)の記事:
GSL Shell 学習:split 関数(再)」の“mysplit”関数

今年6月(2017-06-16)の記事:
Lua ( GSL Shell ) / Penlight 学習:これは頂き」の“utils.split”関数

そして、前(2017-11-27)の記事:
Microlight 学習:split 関数」の“split”関数

これら3法の仕様について比較検証を行った。
 1)タブの扱い
 2)先頭に空白が有る場合
----- test_prog.gsl -----

--「GSL Shell 学習:split 関数(再)」で書いた mysplit 関数
function mysplit( str, sep )
if sep == nil then sep = '%s' end
local t={} ; i=1
for str in string.gmatch( str, "([^"..sep.."]+)") do
t[i] = str i=i+1
end
return t
end

-- Penlight の utils.split 関数
require'pl'
--[[ utils.split( str, sep, plain, n )
・ s: The input string
・ re: A Lua string pattern; defaults to‘%s+’
・ plain: plain don't use Lua patterns
・ n: optional maximum number of splits
]]

-- Microlight の split 関数
require'ml'.import()
--[[ split( s, re, n )
・ s: The input string
・ re: A Lua string pattern; defaults to '%s+'
・ n: optional maximum number of splits
]]

--====================================

-- テストデータ
s1 = ' a b c'; s2 = ' a \t b \t c'

-- 実行1:
print( mysplit(s1) ) --> {"a", "b", "c"}
print( utils.split(s1) ) --> {"", "a", "b", "c"}
print( split(s1) ) --> {"", "a", "b", "c"}

-- 実行2:
print( mysplit(s2) ) --> {"a", "b", "c"}
print( utils.split(s2) ) --> {"", "a", "b", "c"}
print( split(s2) ) --> {"", "a", "b", "c"}

-- 結果:
--[[ 何れも、タブ空白と同じ扱い。
   行頭に空白があった場合の扱いは:
     mysplit:空白が無いのと同じ扱い。
     pl / ml:先頭にが有るとみなす。
]]
と云うことですか。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171030

Microlight 学習:split 関数

2017-11-27 :  PCクリニック
先日(2017-11-22)の記事「Microlight - a very compact Lua utilities module
では、range 関数だった。

更なる学習で、
String utilties に、
split 関数があった。

 split( s, re, n )
   split a delimited string into an array of strings.

 Parameters:
   ・ s: The input string
   ・ re: A Lua string pattern; defaults to '%s+'
   ・ n: optional maximum number of splits

 Returns:

 an array of strings


試しのテストメイン:
--- test.gsl ---
require'ml'.import()

w = 'ABC XYZ'

print( split(w) ) ---> {"ABC", "XYZ"}
関数名が 単なる 'split' であって、
これは good.


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171030

Python-like string formatting

2017-11-24 :  PCクリニック
前(2017-11-22)の記事「Microlight - a very compact Lua utilities module
に続いて、
Lua関連での捜しもので、

Lua Unofficial FAQ (uFAQ)

を見つけた。

このサイトは、

昨年2月(2016-02-18)の記事「GSL Shell 学習:require と、dofile
と、
同年3月(2016-03-06)の記事「GSL Shell 学習:グローバル・テーブル arg
で、参照している。


それで、
改めて中を見ていたら、

1.29 Is there string Interpolation, for example in "$VAR is expanded"?
に、

  Python-like string formatting can be done in Lua:
  Pythonの様な文字列フォーマッティングも Luaで出来る:
print( "%5.2f" % math.pi )
print( "%-10.10s %04d" % { "test", 123 } )
The implementation is short and cool:
実装は短く、かっこいい:
getmetatable("").__mod = function(a, b)
if not b then
return a
elseif type(b) == "table" then
return string.format(a, unpack(b))
else
return string.format(a, b)
end
end
  Lua strings share a metatable,
  so this code overrides the % (modulo) operator for all strings.
  Lua 文字列はメタテーブルを共有するので、
  このコードはすべての文字列の % (剰余) 演算子をオーバーライドする。


そうすると、
この、「関数定義」をしておけば、
string.format ( sprintf )も、
w = ( "%-10.10s %04d" % { "test", 123 } )
w = '%-10.10s %04d' % { 'test', 123 } -- これでもOK
も可能ダ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171028

Microlight - a very compact Lua utilities module

2017-11-22 :  PCクリニック
Lua関連で捜しものをしていたら、・・・・・

  stevedonovan / Microlight
  A little library of useful Lua functions,
  intended as the 'light' version of Penlight

を見つけた。


このページにも解説はあるが、
ドキュメントは、これ:Module ml ですね。

  Microlight - a very compact Lua utilities module
  Steve Donovan, 2012; License MIT


この Microlight は、
最初にあるように、
  Penlight の、
  the 'light' version


試しに、
当記事最初のページの右側にある
緑色の「Clone or download」ボタンから

「Microlight-master.zip」 2015/04/06 版  25.9KB

をダウンロードした。

書庫内には幾つかあるが、
(多分) ml.lua 27.5KB 1つでOK?


少々学習(?)していたら、
7月7日の記事「Lua ( GSL Shell ) / Penlight 学習:range 関数
に比べて、シンプルなものがあった。

  range ( x1, x2, d )
    create an array of numbers from start to end.
    With one argument it goes 1..x1.
    d may be a floating-point fraction


対話型で確認:( 'ml.lua' を置いた場所で )
・・・ DOS 窓で、・・・

> gsl-shell

> _ = require 'ml'.import()

> range( 2, 10 )
{2, 3, 4, 5, 6, 7, 8, 9, 10}

> range( 5 )
{1, 2, 3, 4, 5}

> range( 1, 2, 0.3 )
{1, 1.3, 1.6, 1.9}
となった。


時と場合によっては、'Penlight' よりは使い勝手が良い?


本日はここまで。


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


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


171028

結晶内原子の座標表現形式を変換

2017-11-20 :  PCクリニック
結晶内原子の座標表現を、
XYZ座標値(Cartesian)から相対値表現(Fractional)に変換したい。
使用言語は、Perlで。

それには、
前(2017-11-17)の記事「3元1次連立方程式を解く(Perl版)」で書いた、
処理コードが使える。


結晶格子の3軸ベクトルを、
 a = { ax, ay, az }
 b = { bx, by, bz }
 c = { cx, cy, cz }
の様なものとすると、

前の記事のプログラム Solve_by_Inv-Mat.pl での、
解きたい方程式の係数行列 A は、
( $a11, $a12, $a13, $a21, $a22, $a23, $a31, $a32, $a33 ) =
 ( $ax, $bx, $cx, $ay, $by, $cy, $az, $bz, $cz );
つまり、a,b,c ベクトルは縦方向に並べる。

そうして、
$detA = $a11*$a22*$a33 + $a21*$a32*$a13 + $a31*$a12*$a23 -
 $a11*$a32*$a23 - $a31*$a22*$a13 - $a21*$a12*$a33;
を求め、

逆行列 Inv_A == G を、2段階で計算する:
( $g11, $g12, $g13, $g21, $g22, $g23, $g31, $g32, $g33 ) =
 ( $a22*$a33-$a23*$a32, $a13*$a32-$a12*$a33, $a12*$a23-$a13*$a22,
  $a23*$a31-$a21*$a33, $a11*$a33-$a13*$a31, $a13*$a21-$a11*$a23,
  $a21*$a32-$a22*$a31, $a12*$a31-$a11*$a32, $a11*$a22-$a12*$a21 );

( $g11, $g12, $g13, $g21, $g22, $g23, $g31, $g32, $g33 ) =
 ( $g11/$detA, $g12/$detA, $g13/$detA,
  $g21/$detA, $g22/$detA, $g23/$detA,
  $g31/$detA, $g32/$detA, $g33/$detA );


これで、

対象とする原子の座標(XYZ座標値)を
 { x, y, z }
の様なものとすると、

解きたい方程式の右辺のベクトルは、
( $b1, $b2, $b3 ) = ( $x, $y, $z );
の様になる。


それで、

逆行列により、
$X = $g11*$b1+$g12*$b2+$g13*$b3;
$Y = $g21*$b1+$g22*$b2+$g23*$b3;
$Z = $g31*$b1+$g32*$b2+$g33*$b3;
と算出した結果:
 { $X, $Y, $Z }
は、対象とする原子座標の相対値表現
となりますネ。


本日はここまで。


これって、Perl 学習 かナ?


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


171021

3元1次連立方程式を解く(Perl版)

2017-11-17 :  PCクリニック
前(2017-11-15)の記事「3元1次連立方程式を解く」では、
3元1次連立方程式を解くGSL Shellのコードを作った。

これに従って、
(やりたかった)Perl版コードを作った。
まずは、単純な移植
##### Solve_by_Inv-Mat.pl
## 行列 A
( $a11, $a12, $a13, $a21, $a22, $a23, $a31, $a32, $a33 ) =
( 0, 3, 6, 1, 4, 7, 2, 5, 9 );

$detA = $a11*$a22*$a33 + $a21*$a32*$a13 + $a31*$a12*$a23 -
$a11*$a32*$a23 - $a31*$a22*$a13 - $a21*$a12*$a33;

## 逆行列 Inv_A == G を、2段階で
( $g11, $g12, $g13, $g21, $g22, $g23, $g31, $g32, $g33 ) =
($a22*$a33-$a23*$a32, $a13*$a32-$a12*$a33, $a12*$a23-$a13*$a22,
$a23*$a31-$a21*$a33, $a11*$a33-$a13*$a31, $a13*$a21-$a11*$a23,
$a21*$a32-$a22*$a31, $a12*$a31-$a11*$a32, $a11*$a22-$a12*$a21);
( $g11, $g12, $g13, $g21, $g22, $g23, $g31, $g32, $g33 ) =
($g11/$detA, $g12/$detA, $g13/$detA,
$g21/$detA, $g22/$detA, $g23/$detA,
$g31/$detA, $g32/$detA, $g33/$detA );


## 一方、右辺 B
( $b1, $b2, $b3 ) = ( 1, 0, -2 );

## そして、逆行列により解を算出
$X = $g11*$b1+$g12*$b2+$g13*$b3;
$Y = $g21*$b1+$g22*$b2+$g23*$b3;
$Z = $g31*$b1+$g32*$b2+$g33*$b3;

## 確認
print( $X, ", ", $Y, ", ", $Z, ";\n" ); #> -2.3333333, 2.3333333, -1;
出来ました。

当たり前?


本日はここまで。


時には、Perl 学習もある?


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


171020

3元1次連立方程式を解く

2017-11-15 :  PCクリニック
昨年(2016-02-02)の記事「GSL Shell 学習:matrix.solve( A, b )」で、
3元1次連立方程式を解くには、matrix.solveで十分であった。

今回、
訳あって、自前コードで処理したくなった。


参考サイトとしては、下記の2つ。

連立方程式の解き方」から、

■連立1次方程式の解き方

  未知数3個、方程式3個
  a11*x + a12*y + a13*z = b1
  a21*x + a22*y + a23*z = b2
  a31*x + a32*y + a33*z = b3

は、行列を用いて、

  A * X = B

の様に書ける。

それで、
方法は2通りあるが、

(1) 逆行列を用いる方法

  X = Inv_A * B

とやれば良い。


それから、
逆行列」から、

3×3行列の逆行列の公式

  A = { { a11, a12, a13 }, { a21, a22, a23 }, { a31, a32, a33 } }

について、

  detA = a11*a22*a33 + a21*a32*a13 + a31*a12*a23 -
      a11*a32*a23 - a31*a22*a13 - a21*a12*a33

がゼロでないとき、

逆行列:
 Inv_A = 1 / detA *
   { { a22*a33 - a23*a32 , a13*a32 - a12*a33 , a12*a23 - a13*a22 },
    { a23*a31 - a21*a33 , a11*a33 - a13*a31 , a13*a21 - a11*a23 },
    { a21*a32 - a22*a31 , a12*a31 - a11*a32 , a11*a22 - a12*a21 } }


以上の公式に従って、
昨年の記事のデータで、
素直にコーディング
----- Solve_by_Inv-Mat.gsl
-- 行列 A
a11, a12, a13, a21, a22, a23, a31, a32, a33 =
0, 3, 6, 1, 4, 7, 2, 5, 9

detA = a11*a22*a33 + a21*a32*a13 + a31*a12*a23 -
a11*a32*a23 - a31*a22*a13 - a21*a12*a33

-- 逆行列 Inv_A == G を、2段階で
g11, g12, g13, g21, g22, g23, g31, g32, g33 =
a22*a33-a23*a32, a13*a32-a12*a33, a12*a23-a13*a22,
a23*a31-a21*a33, a11*a33-a13*a31, a13*a21-a11*a23,
a21*a32-a22*a31, a12*a31-a11*a32, a11*a22-a12*a21
g11, g12, g13, g21, g22, g23, g31, g32, g33 =
g11/detA, g12/detA, g13/detA,
g21/detA, g22/detA, g23/detA,
g31/detA, g32/detA, g33/detA

-- 一方、右辺 B
b1, b2, b3 = 1, 0, -2

-- そして、逆行列により解を算出
X = g11*b1+g12*b2+g13*b3
Y = g21*b1+g22*b2+g23*b3
Z = g31*b1+g32*b2+g33*b3

-- 確認
print( X, Y, Z ) --> -2.3333333, 2.3333333, -1
出来ました。

当たり前?


本日はここまで。


これで、(やりたかったコト) Perl 版を作ろう。


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


171020

DICOM ファイルを TIFF に変換(再改訂版)

2017-11-13 :  PCクリニック
前(2017-11-10)の記事「DICOM ファイルを TIFF に変換(改訂版)」を
書いたばかりだが、
その後に、
更なる新たな .dcm ファイルを入手した。

だが、このファイル形式には
対応できなかった。

データ部分のサイズを指定する、
変数 g で表しているコード値が 0x7FE0 のモノが2つあった。

これの識別は難しいので、

g が 40 で、
e が 0x0010 と 0x0011 の時の val 値から、
データサイズを取得したら、
後は、
ファイルの最後から
データ本体部分を取得すること
にした。

プログラム名を“DICOM_to_TIFF_Rev2.gsl”とした:
----- DICOM_to_TIFF_Rev2.gsl -----
require'pl'; _=path.currentdir()
require'cv2_a'; SF = string.format
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)

Fname = 'x.dcm'; IN = io.open( Fname, 'rb' ) -- サンプルデータ --
FSZ = lfs.attributes( Fname, 'size' ) -- ファイルサイズ

-- 先頭 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

g = ReadUInt16()
------- g の判定は、以下のループの中に纏めた。
while g==2 or g==8 or g==16 or g==24 or g==32 or
g==40 or g==64 or g==0x7005 or g==0x7FE0 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
_tmp = ReadUInt16() -- Read the reserved byte
if string.sub(vr,1,1) == 'O' then
-- g==2 での'OB' と、0x7FE での'OW'
length = ReadUInt32()
else
length = ffi.cast('uint16_t*',vr)[0] + _tmp*256*256 -- *****
end
end
----- print( g, e, vr, length, SF('%X',IN:seek()) ) -- デバッグ用

if g==0x7FE0 then break end
val = ReadChars(length)
---------------------------
if g==40 then
if e==0x0010 then yy = uint16(val)[0] end
if e==0x0011 then xx = uint16(val)[0] end
if e==0x0100 then bpp= uint16(val)[0] end
end
---------------------------
g = ReadUInt16()
end

if bpp ~= 16 then print( 'Not 16bits' ); _=io.read(1); os.exit() end

----- 「g==0x7FE0」が2つあるので、全体から逆算する:
f_pos=IN:seek()
print( z, xx, yy, bpp, length + f_pos ) -- 進行確認用

nokori = FSZ - f_pos
if nokori > xx*yy*2 then _ = ReadChars( nokori- xx*yy*2 ) end

AT = uint16( IN:read('*a') ) -- Read '*a' == length == xx*yy*2
IN:close()

------------------------------
tif = cv2.cvCreateMat( yy, xx, CV_16UC1 )
BT = ffi.cast( 'uint16_t*', tif.Byte )

for n=0,xx*yy-1 do
if AT[0]>32767 then
BT[n] = AT[n] + 0x8000 --========
else
BT[n] = AT[n]
end
end

if string.find( Fname, 'dcm' ) ~= nil then
FN = string.gsub( Fname, '.dcm', '.tif' )
else
FN = Fname..'.tif'
end
cv2.cvSaveImage( 'o-'..FN , tif, 0 )
これで、?????

これで、
.dcmファイルを 16 bit TIFFファイルに変換できた。


前回のものより更なる汎用化ができた?


本日はここまで。


DICOM 学習は続く?


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


171021

DICOM ファイルを TIFF に変換(改訂版)

2017-11-10 :  PCクリニック
先日(2017-10-16)の記事「DICOM ファイルを TIFF に変換」では、
.nii ファイルを経由せずに、
.dcm ファイルから 直接 TIFF ファイルに変換する
プログラム“DICOM_to_TIFF.gsl”を作った。

しかし、
新たな .dcm ファイルを入手したが、
対応できないモノだった。

更なる DICOM ファイルの仕様を解読し、
何とか読み込めるメドついた。

ポイントは、前回コードの
変数 g で表しているコード値が 2 以外の時でも
変数 vr で表しているタイプが指定されているモノでした。

これに対応した処理方式と、以前のデータに対する処理方式を
併せて、キモチ汎用版を作った。

プログラム名を“DICOM_to_TIFF_Rev.gsl”とした:
----- DICOM_to_TIFF_Rev.gsl -----
require'pl'; require'cv2_a'; SF = string.format
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)

Fname = 'x.dcm'; IN = io.open( Fname, '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

g = ReadUInt16()
------- g の判定は、以下のループの中に纏めた。
while g==2 or g==8 or g==16 or g==24 or g==32 or
g==40 or g==64 or g==0x7005 or g==0x7FE0 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
_tmp = ReadUInt16() -- Read the reserved byte
if string.sub(vr,1,1) == 'O' then -- g==2 の'OB' と、0x7FE の'OW'
length = ReadUInt32()
else
length = ffi.cast('uint16_t*',vr)[0] + _tmp*256*256 -- *****
end
end
----- print( g, e, vr, length, SF('%X',IN:seek()) ) -- デバッグ用

if g==0x7FE0 then break end
val = ReadChars(length)
---------------------------
if g==40 then
if e==0x0010 then yy = uint16(val)[0] end
if e==0x0011 then xx = uint16(val)[0] end
if e==0x0100 then bpp= uint16(val)[0] end
end
---------------------------
g = ReadUInt16()
end

if bpp ~= 16 then print( 'Not 16bits' ); _=io.read(1); os.exit() end

AT = uint16( IN:read('*a') ) -- Read '*a' == length == xx*yy*2
IN:close()

------------------------------
tif = cv2.cvCreateMat( yy, xx, CV_16UC1 )
BT = ffi.cast( 'uint16_t*', tif.Byte )

for n=0,xx*yy-1 do
if AT[0]>32767 then
BT[n] = AT[n] + 0x8000 --========
else
BT[n] = AT[n]
end
end

if string.find( Fname, 'dcm' ) ~= nil then
FN = string.gsub( Fname, '.dcm', '.tif' )
else
FN = Fname..'.tif'
end
cv2.cvSaveImage( 'o-'..FN , tif, 0 )
これで、?????

これで、
.dcmファイルを 16 bit TIFFファイルに変換できた。
前回のものよりキモチ汎用で。


本日はここまで。


DICOM 学習は続く?


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


171018

GSL Shell コード・テンプレート

2017-11-08 :  PCクリニック
昨年暮れ(2016-12-26)に「viva “GSL Shell”」を書いた。

その後も、<紙>にとってのメイン言語 と云うことで、

新規に作るプログラムは、原則 GSL Shell で作り、
更に過去に作った、Perl や、R や、Python プログラムも
GSL Shell に移植してきた。


ここで、
今後のコーディングの見本として、

Code Template を作ってみた。

プログラム名は「Code_Template.gsl」:
----- Code_Template.gsl     <== プログラムの名前

--[[
   プログラムの仕様・コメント 等々

  プログラム・ファイルのコード:'Shift-JIS'

  コマンドライン引数:
   arg 引数リスト    #arg 引数の個数
arg[0] 当プログラム名

]]
--===========================
require'cv2_a' -- 'OpenCV' 使用: cv2.cvLoadImageM 等々
require'gsl_a' -- 'GSL' 使用: gsl.gsl_rng_get 等々
gp = require'gnuplot' -- 'gnuplot' 使用: gp.Plot 等々
require'pl' -- 'Penlight'使用: path.currentdir 等々

require'winman' -- 'afxLua/winman'使用: winman.send 等々
Iup = require'IUP' -- 'IUP' 使用: Iup.Open 等々

lfs = require'lfs' -- 'LFS' 使用: lfs.attributes 等々
--- 'Penlight' 経由で 'lfs' を使うなら
_ = path.currentdir()

--===========================
-- use'math' -- 'math.log' を 'log' と モジュール名の省略
-- use'bit' -- 'bit.band' を 'band'   ※ 使用は要注意

f = |x| x^2 - 1 --=== function f(x) return x^2-1 end

--===========================

----- ディレクトリ内ファイル一覧取得:
require'pl'
f_list = dir.getfiles( Dir )


----- ファイル(不)存在チェック:
require'afx'
if not afx.fileexists( f ) then
-- ~
end


-- D&D でファイル名取得:
require'pl'
Dir, Fname = path.splitpath( arg[1] )
lfs.chdir( Dir ) -- これ必要???


----- 入力テキストファイルについて、
-- ファイル全体を一括で(文字列として)読み込む:
require'pl'
wstr = file.read( 'hoge.txt' )

-- ファイル全体を行毎の文字列配列で読み込む:
require'pl'
w = utils.readlines( 'hoge.txt' )
-- 更に、一行分を分割(空白区切り):
v = stringx.split(w[i])

-- CSVファイル全体をテーブルとして読み込む:
t = csv.read( 'hoge.csv' )
-- 更に、数値のみなら行列に変換:
m = matrix.def( t )
----- 非数値データの行(テーブル要素)を除くには:
table.remove( t, 1 ) -- とかで。

----- 入力バイナリファイルについて、
-- ファイル全体を4バイト整数配列として読み込む:
IN=io.open('hoge','rb'); buf=IN:read('*a'); IN:close()
pt=ffi.cast('int32_t*',buf)


----- 出力テキストファイルについて、
-- 'fprintf' で書き出し:
require'pl'; OT=io.open('f.txt','w')
utils.fprintf( OT, ' %g %d %s\n' , floatv, intv, str )
OT:close()

--======================
----- 文字列が数値を表すか の判定
if tonumber( str ) ~= nil then
-- ~
end

--======================

----- Python の 'range' 相当
require'pl'

for k in seq.range( 0, n-1 ) do -- for k in range( n ) :
-- ~ -- # ~
end -- # 無し

for k in seq.range( i, j-1 ) do -- for k in range( i, j ) :
-- ~ -- # ~
end -- # 無し


plc = require'pl.comprehension'.new()
T = plc('x for x=1,5')() -- T は { 1, 2, 3, 4, 5 }
--- plc 'x for x=1,5' () -- これでも可
V = matrix.vec( plc'x for x=1,5'() ) -- これで 'matrix'ベクトル


--======================
----- 三角関数 逆三角関数
-- sin、cos、tan、・・・・・ asin、acos、atan、atan2

----- 特殊関数
-- sf.fact(n) ・・・ 階乗(factorial) n!
-- sf.gamma(x)・・・ ガンマ関数(gamma function)
-- x は正数。 use:real Lanczos method ( ランチョス法 )


--======================
--[[ --- 過去記事/備忘録 ---

備忘録:(2017-04-08)記事
Lua 言語仕様:備忘録(忘れやすい事)4言語対比表
「H29-03-04_Lua言語仕様_備忘録.html」H29-03-22 /_GSL/

関数フィッティング:(2017-04-05)記事
GSL Shell 学習:Fitting サブ(改)
「SUB_GSL_Fit.lua」H28-02-04 /_GSL/H28-12-10_FitGSL/

非線形1変数方程式の求解:(2017-06-21)記事
GSL Shell:非線形1変数方程式の求解モジュール自作
「NL_1var_Rev.gsl」H28-05-07 /_GSL_tcc/H29-05-06_Solve_Newton/

非線形2変数方程式の求解:(2017-06-24)記事
GSL Shell:非線形2変数方程式の求解モジュール自作
「NL_2var_Rev2.gsl」H28-05-11 /_GSL_tcc/H29-05-06_Solve_Newton/

スプライン補間:(2016-09-19)記事
GSL Shell 学習:スプライン補間
「GDT_Spline.gsl」H28-08-12 /_GSL/H28-08-12_Spline/

'OpenCV' サンプルコード:(2017-07-30)記事
OpenCV:cvFindContours 正常に出来た
「cvFitEllipse2_7.gsl」H29-06-28 /_GSL_CV/H29-06-27_FindContours_FitEllipse2/

'GSL' サンプルコード:(2017-08-23)記事
GSL 学習:配列要素の並び替え
「gsl_sort.gsl」H29-07-17 /_GSL_gslib/H29-07-17_Sorting/

'gnuplot' 用モジュール定義:(2017-11-06)記事
Lua & gnuplot:gnuplot モジュール改訂2
「gnuplot.lua」H29-06-20 /_gnuplot/H29-06-20_gp_lua/

'IUP' サンプルコード:(2017-02-12)記事
IUP で GUI アプリ:コード改訂
「IUP_Exact_Dbl_Entou_Rev.gsl」H29-01-18 /_GSL/H29-01-18_IUP_3/

'afxLua' サンプルコード:'afx'、'cio'、'clipboard'、'winman'、'winreg'
検索「afxLua
]]
取り敢えずは、こんなところ?



本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


171009,13

Lua & gnuplot:gnuplot モジュール改訂2

2017-11-06 :  PCクリニック
6月(2017-06-26)の記事「Lua & gnuplot:gnuplot モジュール改訂」で、
  ・・・・・
  ・・・・・
  今回インターフェイスは変えずに、若干の改訂を行った。

  1.生成する数値のフォーマットを変更

  ・・・・・
  ・・・・・

  2.フォント指定を変更

  ・・・・・
  ・・・・・

と、若干の改訂を行っているが、

今回、gnuplot.luaモジュールについて、
更なる若干の改訂を行った。

1.カラーパレット定義 関数を追加
  ・gp.Palette( )
  “シキノート”サイトの
  「gnuplotのカラーマップ」記事を参考にさせて頂いた。

   GNUPLOTのカラーマップ 2015年5月16日
   一番良いと思ったカラーマップは、matlabで使われている”jet”だと感じました。
  と云うことで、これを頂きました。


2.matrix データ定義 関数を追加
  ・gp.Mat( ~ )
  6月(2017-06-30)の記事「gnuplot 学習:matrix 形式データ
  ・・・・・
  ・・・・・
  このことには要注意だが、
  matrix形式データが定義できる様にしたい。
   先日(2017-06-26)の記事:
  「Lua & gnuplot:gnuplot モジュール改訂」で書いた、
  改訂“gnuplot”モジュールの追加改訂を行おう。
  ・・・・・
  ・・・・・
  に対応した追加作業。


結果は:
----- gnuplot.lua -----
local gp = {}

local SF = string.format
local SS = string.sub
local function split_path( p ) return string.match( p, "(.-)([^\\]-([^%.]+))$" ) end

function gp.Open( fn )
if fn == nil then
GP = io.popen( 'gnuplot -persistent', 'w' ) ----- ファイル名無し:画面出力
else
local Dir, FN, ext = split_path( fn )
if ext ~= 'plt' then FN = FN..'.plt' end ----- .plt 無し なら付加する
GP = io.open( FN, 'w' )
end
GP:write( 'set term wxt size 800, 600\n' ) ----- 窓サイズ
GP:write( 'set term wxt font "Arial,12"\n' ) ----- フォント
GP:write( 'set size 1.0, 0.98\n' ) ----- グラフサイズ
end

function gp.Pdf( fn )
local Dir, FN, ext = split_path( fn )
if ext ~= 'pdf' then FN = FN..'.pdf' end ----- .pdf 無し なら付加する
GP:write( 'set term pdf size 8, 6\n' ) ----- ページサイズ
GP:write( 'set term pdf font "Arial,12"\n' ) ----- フォント
GP:write( SF('set output "%s"\n', FN ) ) ----- PDFファイル名
end

function gp.Close() ----- ファイルclose
GP:close()
end

function gp.Com( c ) ----- 任意の コマンド用
GP:write( SF('%s\n', c ) ) ----- コマンド&パラメータ
end

function gp.Set( s ) ----- set コマンド用
GP:write( SF('set %s\n', s ) ) ----- パラメータ
end

function gp.UnSet( s ) ----- unset コマンド用
GP:write( SF('unset %s\n', s ) ) ----- パラメータ
end

function gp.Table( fn )
if fn == nil then
GP:write( SF('set table\n', fn ) ) ----- table コマンド用
elseif SS(fn,1,1) == '$' then
GP:write( SF('set table %s\n', fn ) )
else
GP:write( SF('set table "%s"\n', fn ) )
end
end

function gp.Title( t, s )
if s == nil then s = 36 end
GP:write( SF('set title "%s"\n', t ) ) ----- タイトル
GP:write( SF('set title font "Arial,%d"\n', s ) ) ----- フォント
end

function gp.Xlog()
GP:write( 'set logscale x\n' ) ----- 対数目盛
end

function gp.Xlabel( L, s )
if s == nil then s = 20 end
GP:write( SF('set xlabel "%s"\n', L ) ) ----- ラベル
GP:write( SF('set xlabel font "Arial,%d"\n', s ) ) ----- フォント
end

function gp.Xrange( s )
GP:write( SF('set xrange %s\n', s ) ) ----- 範囲
end

function gp.Ylog()
GP:write( 'set logscale y\n' ) ----- 対数目盛
end

function gp.Ylabel( L, s )
if s == nil then s = 20 end
GP:write( SF('set ylabel "%s"\n', L ) ) ----- ラベル
GP:write( SF('set ylabel font "Arial,%d"\n', s ) ) ----- フォント
end

function gp.Yrange( s )
GP:write( SF('set yrange %s\n', s ) ) ----- 範囲
end

function gp.KeyOff()
GP:write( 'set key off\n' ) ----- 凡例無し
end

function gp.Palette()
GP:write( 'set palette defined ( 0 "#000090", 1 "#000FFF", 2 "#0090FF", 3 "#0FFFEE", 4 "#90FF70", 5 "#FFEE00", 6 "#FF7000", 7 "#ee0000", 8 "#7F0000")\n' )
end ----- カラーパレット:jet

function gp.Plot( p ) ----- 引数そのママ
GP:write( SF('plot %s\n', p ) ) ----- Plot コマンド
end

function gp.RePlot( p )
GP:write( SF('replot %s\n', p ) ) ----- replot
end

function gp.Data( b, n, x, y ) ----- b:origin
local px, py = x, y
if b==0 then ----- 1 or 0
px, py = ffi.cast('double*', x ), ffi.cast('double*', y )
end
for k=b,n-(1-b) do
GP:write( SF('%g %g\n', px[k], py[k] ) )
end
GP:write( 'e\n' )
end

function gp.DataBlk( BN, b, n, x, y, ... ) ----- BN:Block名
local t, pt = {...}, {} ----- 3列以上は、b==0 の場合のみ可
local px, py = x, y ----- b==1 では無視
if b==0 then
px, py = ffi.cast('double*', x ), ffi.cast('double*', y )
for i,p in ipairs(t) do pt[i]=ffi.cast('double*', t[i] ) end
end
GP:write( SF('%s << EOD\n', BN ) )
for k=b,n-(1-b) do
GP:write( SF('%g %g', px[k], py[k] ) )
for i,_ in ipairs(pt) do GP:write( SF(' %g', pt[i][k] ) ) end
GP:write( '\n' )
end
GP:write( 'EOD\n' )
end

function gp.Mat( BN, M, yy, xx ) ----- BN:Block名
local m = ffi.cast('double*', M ) ----- M : yy行 xx列
GP:write( SF('%s << EOD\n', BN ) )
for y=0,yy-1 do
for x=0,xx-1 do
GP:write( SF('%g ', m[y*xx+x]) )
end
GP:write( '\n' )
end
GP:write( 'EOD\n' )
end

return gp
となった。


本日はここまで。


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


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


170620,30

image_viewer 自作

2017-11-01 :  PCクリニック
7ヶ月前(2017-04-03)の記事「OpenCV 学習:任意のタイプの画像表示+alpha
に載せた、
DnD_img_mouse_CV.gsl は、“グレースケール限定”だった。


今回、この制限を解除すべく、

1.機能拡張を行う。

序でに、

2.'cv2' モジュールの代わりに 'cv2_a' モジュールを使う。

3.'lfs' モジュールの代わりに 'Penlight' モジュールを使う。


それで、
出来上がったのは、・・・・・
----- DnD_image_viewer.gsl -----
require 'cio'; require'pl'; require'cv2_a'
function CHK_IF( pt )
local t, n = 5, 0; while pt[n]==0 do n=n+1 end -- 必ず終わるハズ!
if math.abs(pt[n])<2^29 then t=4 end
return t
end
-------------------------------------
Dir, Fname = path.splitpath( arg[1] ) -- D&D でファイル名取得
lfs.chdir( Dir ) -- これがないと、ダメ?
-- ==================================
local onmouse = ffi.cast( 'CvMouseCallback', function(event,x,y,flags)
if event == 0 then -- cv2.EVENT_MOUSEMOVE:
cio.gotoxy(0,3)
if typ>10 then pt=3*(y*xx+x)
b,g,r = IMG[pt],IMG[pt+1],IMG[pt+2]
print( string.format('Pos:(%d,%d)=%g,%g.%g ', x, y, r,g,b ) )
else
print( string.format('Pos:(%d,%d)=%g ', x, y, IMG[y*xx+x] ))
end
end
end )
-- ==================================
img = cv2.cvLoadImageM( Fname, -1 ) -- ファイル内のママ
yy, xx, typ = img.yy, img.xx, img.type%256
if typ == 0 then IMG=img.Byte
elseif typ==2 then IMG=img.Word
elseif typ==4 then IMG=img.Int ----- これ存在し得ない???
elseif typ==5 then IMG=img.Int
typ=CHK_IF(IMG)
if typ==5 then IMG=ffi.cast('float*',IMG) end
elseif typ==6 then IMG=img.Dbl
else typ=16; IMG=img.Byte ----- RGB 画像  ※ 今回機能追加
end

FT={ '8I', '', '16I', '', '32I', '32F', '64F' }; FT[16+1]='BGR'

if typ>10 then --- カラー画像 ------

dsp = cv2.cvCreateMat( yy, xx, 16 )
for n=0,3*xx*yy-1 do dsp.Byte[n]=IMG[n] end

cv2.cvNamedWindow( charA('img'), 0 )
cv2.cvSetMouseCallback( charA('img'), onmouse, NULL )
cio.gotoxy(0,0)
print( 'ESC key <=== Exit' )
print(string.format('File Type: %s. Size: %dx%d', FT[typ+1], xx, yy))
print( 'Value : R, G, B' )
while true do
cv2.cvShowImage( charA('img'), dsp )
k = bit.band( 0xFF, cv2.cvWaitKey(50) ) -- key bindings
if k == 27 then break end -- esc to exit
end

else ----- GrayScale画像 -------

Mx, Mn = -1e+100, 1e+100
for n=0,xx*yy-1 do
if IMG[n]>Mx then Mx=IMG[n] end
if IMG[n] end

dsp = cv2.cvCreateMat( yy, xx, 0 )
for n=0,xx*yy-1 do dsp.Byte[n]=(IMG[n]-Mn)/(Mx-Mn)*255+0.5 end

cv2.cvNamedWindow( charA('img'), 0 )
cv2.cvSetMouseCallback( charA('img'), onmouse, NULL )
cio.gotoxy(0,0)
print( 'ESC key <=== Exit' )
print(string.format('File Type: %s. Size: %dx%d', FT[typ+1], xx, yy))
print(string.format('Value : Max=%g, Min=%g', Mx, Mn))
while true do
cv2.cvShowImage( charA('img'), dsp )
k = bit.band( 0xFF, cv2.cvWaitKey(50) ) -- key bindings
if k == 27 then break end -- esc → exit
end

end

cv2.cvDestroyAllWindows() -- 後処理
これで、・・・・・

対象とする画像の 種類は、
 ・ 8ビット整数
 ・ 16ビット整数
 ・ 32ビット整数
 ・ 32ビット浮動小数点数
 ・ 64ビット浮動小数点数
 ・ RGB(8ビット整数×3)
となる。


本日はここまで。


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


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


170813

GSL Shell プログラム:xyz2mol.gsl

2017-10-30 :  PCクリニック
前(2017-10-27)の記事「Python プログラム:xyz2mol.py」で、
既存の“xyz2mol”プログラム
即ち、

   座標データだけから成るファイルを元に、
   原子間の結合データを生成

する処理コード
を纏めた。


そこで、
このPython プログラムを、
Lua(GSL Shell)に移植した。


取り敢えずは単純な移植なのだが、
序でなので、
(1) 入力ファイルは、ドラッグ&ドロップで指定する
(2) 原子数(と結合数)は最大 999 までとする
ところまでは機能強化した。

--------------- DnD_xyz2mol.gsl
require'pl'
--------------------
Dir, Fname = path.splitpath( arg[1] ) -- D&D でファイル名取得
lfs.chdir( Dir ) -- これ必須?
file_nm = string.gsub( Fname, '.xyz', '' ) -- 入力「.xyz」ファイル ( 除 拡張子 )
-- 出力ファイル名は、(file_nm).mol ( 結合情報付き )

Dx=1.10 -- 結合判定用:共有結合半径の和の Dx 倍以内
--====================================
-- 1...92 元素名(左詰め)
tt = ' H HeLiBeB C N O F NeNaMgAlSiP S ClAr KCaScTiV CrMnFeCoNiCuZnGaGeAsSeBrKrRbSrY ZrNbMoTcRuRhPdAgCdInSnSbTeI XeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTaW ReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPaU '

-- 1..92 共有結合半径 ( From Winmostar )
rr = '0.29 1.30 1.23 0.90 0.82 0.77 0.75 0.73 0.72 1.60 1.54 1.36 1.18 1.11 1.06 1.02 0.99 1.90 2.03 1.74 1.44 1.32 1.22 1.18 1.17 1.17 1.16 1.15 1.17 1.25 1.26 1.22 1.20 1.16 1.14 2.00 2.16 1.91 1.62 1.45 1.34 1.30 1.27 1.25 1.25 1.28 1.34 1.48 1.44 1.41 1.40 1.36 1.33 2.20 2.35 1.98 1.69 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.44 1.34 1.30 1.28 1.26 1.27 1.30 1.34 1.49 1.48 1.47 1.45 1.46 1.45 2.71 2.40 2.10 1.70 1.70 1.70 1.70'
rTc = stringx.split( rr ) -- 文字列配列(空白区切)

An={}; Ac=matrix.new( 999, 1 )
Ax=matrix.new( 999, 1 ); Ay=matrix.new( 999, 1 ); Az=matrix.new( 999, 1 )
B1=matrix.new( 999, 1 ); B2=matrix.new( 999, 1 ); rT=matrix.new( 92, 1 )
for i=1, #rTc do rT[i]=rTc[i]+0 end

w = utils.readlines( file_nm .. '.xyz' ) -- 入力「.xyz」ファイル取り込み
aa=w[1]+0 -- Atom 数
wl2=w[2] -- セルベクトル情報 ( 文字列のママ )
for a=1,aa do v = stringx.split(w[a+2])
Ax[a]=v[2]+0; Ay[a]=v[3]+0; Az[a]=v[4]+0
an = string.sub(v[1]..' ',1,2); k = string.find( tt, an )
An[a]=an; Ac[a]=k/2
end

bb=0 -- ===== 結合計算 =======
for k=1,aa do
for j=1,k-1 do
dd2=(Ax[k]-Ax[j])^2+(Ay[k]-Ay[j])^2+(Az[k]-Az[j])^2
dr2=((rT[Ac[k]]+rT[Ac[j]])*Dx)^2
if dd2 end
end

OT = io.open( file_nm .. '.mol', 'w' ) --=== 「.mol」ファイル出力
utils.fprintf( OT, '--- from %s.xyz --> %s.mol\n' , file_nm,file_nm )
utils.fprintf( OT, '%s\n' , wl2 )
utils.fprintf( OT, "By 'xyz2mol.gsl'\n" )
utils.fprintf( OT, '%3d%3d 0 0 0 0 1 V2000\n' , aa, bb )
for a=1,aa do
utils.fprintf( OT, ' %9.5f %9.5f %9.5f %-2s 0 0 0 0 0 0\n' ,
Ax[a], Ay[a], Az[a], An[a] )
end
for b=1,bb do
utils.fprintf( OT, '%3d%3d 1 0 0 0\n' , B1[b], B2[b] )
end
utils.fprintf( OT , 'M END\n' )
OT:close()
となった。


本日はここまで。


この GSL Shell プログラムを流用して、目的のモノを作ろう!


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


171009

Python プログラム:xyz2mol.py

2017-10-27 :  PCクリニック
3年前(2014-08-08)になる古い記事ですが、
プログラム設計:msi2mol」正しくは、xyz2molでしたが。

それで、
この記事にある設計に従って、
Python プログラム xyz2mol.py を作っていた。

なぜ今頃?

実は同様なことを、最近やりたくなって、
当然 GSL Shell で作る予定だが、・・・

探していたら、過去に作っていたので、
これをベースに移植を考えた。


なので、当時のコードをここに整理した。

# ----------------------- xyz2mol.py
from math import *
from string import *

file_nm = 'test' # 入力「.xyz」ファイル名 ( 除 拡張子 )

# 出力ファイル名は、(file_nm).mol ( 結合情報付き )

Dx=1.10 # 結合判定:共有結合半径の和の Dx 倍以内

tt = " HHeLiBe B C N O FNeNaMgAlSi P SClAr KCaScTi VCrMnFeCoNiCuZnGaGeAsSeBrKrRbSr YZrNbMoTcRuRhPdAgCdInSnSbTe IXeCsBaLaCePrNdPmSmEuGdTbDyHoErTmYbLuHfTa WReOsIrPtAuHgTlPbBiPoAtRnFrRaAcThPa U"
# 1...92 元素名(右詰め)

rr = " 0.00 0.29 1.30 1.23 0.90 0.82 0.77 0.75 0.73 0.72 1.60 1.54 1.36 1.18 1.11 1.06 1.02 0.99 1.90 2.03 1.74 1.44 1.32 1.22 1.18 1.17 1.17 1.16 1.15 1.17 1.25 1.26 1.22 1.20 1.16 1.14 2.00 2.16 1.91 1.62 1.45 1.34 1.30 1.27 1.25 1.25 1.28 1.34 1.48 1.44 1.41 1.40 1.36 1.33 2.20 2.35 1.98 1.69 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.70 1.44 1.34 1.30 1.28 1.26 1.27 1.30 1.34 1.49 1.48 1.47 1.45 1.46 1.45 2.71 2.40 2.10 1.70 1.70 1.70 1.70" # 1..92 共有結合半径 ( From Winmostar )
rTc=rr.split() # 文字列配列(空白区切)

An=['']*300; Ax=[0]*300; Ay=[0]*300; Az=[0]*300;
Ac=[0]*300; B1=[0]*300; B2=[0]*300; rT=[0]*100; # 配列(リスト)初期化
for i in range(len(rTc)): rT[i]=float(rTc[i])

IN = open( file_nm + '.xyz' ) # === 入力「.xyz」ファイル取り込み ===
w=IN.readline(); aa=int(w) # Atom 数
wl2=IN.readline()
for a in range(aa):
w=IN.readline(); w=w.rstrip('\r\n'); v=w.split()
an=v[0]; Ax[a]=float(v[1]); Ay[a]=float(v[2]); Az[a]=float(v[3])
if( len(an)==1 ): an=" "+an
k=tt.find(an)
An[a]=v[0]; Ac[a]=k/2
IN.close()

bb=0 # ===== 結合関係計算 =====
for k in range(1,aa):
kb=k-1
for j in range(kb):
if( Ac[k]==Ac[j] ): continue
dd2=(Ax[k]-Ax[j])**2+(Ay[k]-Ay[j])**2+(Az[k]-Az[j])**2
dr2=((rT[Ac[k]]+rT[Ac[j]])*Dx)**2
if( dd2
OT = open( file_nm + '.mol', 'w' ) # === 「.mol」ファイル出力 ===

OT.write( '--- from ' + file_nm + '.xyz --> ' + file_nm + '.mol\n' )
OT.write( wl2 )
OT.write( "By 'xyz2mol.py'\n" )
OT.write( str(aa).rjust(3) + str(bb).rjust(3) + ' 0 0 0 0 1 V2000\n' ) # sprintf 形式
for a in range(aa):
OT.write( " %9.5f %9.5f %9.5f %-2s 0 0 0 0 0 0\n" % ( Ax[a], Ay[a], Az[a], An[a] ) ) # printf 形式
for b in range(bb):
OT.write( "%3d%3d 1 0 0 0\n" % ( B1[b], B2[b] ) )
OT.write( "M END\n" )
OT.close();
と云うこと?


本日はここまで。


このプログラムを参考にして GSL Shell で作ろう!


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


140215,171006

ImageJ 学習:“OpenCV”の利用

2017-10-25 :  PCクリニック
前(2017-10-23)の記事「ImageJ 学習:“Re-ImageJで学ぶ!”サイト
で書いた記事一覧に、

  第67回 ImageJによるOpenCVの利用で学ぶ!

がある。

かなり気になったので、・・・・・

「ImageJ OpenCV」で検索してみた。


真っ先に「OpenCV - ImageJ」が見つかる。

 ・・・・・
 ・・・・・
 Currently, there are three alternatives to connect ImageJ with OpenCV:

 ・CVForge: an ImageJ plugin implementing a simple-to-use interface ・・・
 ・IJ-OpenCV: a library to create applications combining features from ・・・
 ・IJToolsUsingOpenCV: a suite of ImageJ plugins that connects ImageJ ・・・


そして、3番目の方法に関しては、
WAKU-TAKE-A PROGRAM
ImageJからOpenCVを利用しよう!
が見つかる。

  ImageJからOpenCVを利用しよう!
  9th July 2017 at 10:47am

  Windows版OpenCVには、Java用のラッパーが用意されています。

  このラッパーを使って、OpenCVの関数を利用するImageJ用プラグインを
  作成することができます。以下のHowToで説明します。
  思ったより簡単に出来て、自分でも驚きました。

  私も「IJToolsUsingOpenCV」というImageJ用プラグインを作ってみました。
  リンク先にコードがありますので参考にしてください。

  手軽に試してみたい方は、作成したプラグインのバイナリー(classファイル)を
  こちらに置いておきますので、是非使ってみてください。

  HowTo

   ・ ImageJからOpenCVを利用する方法について



この辺りの記事を良く読んで、学習かナ?



本日はここまで。


ImageJ 学習は続く?


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


171007

ImageJ 学習:“Re-ImageJで学ぶ!”サイト

2017-10-23 :  PCクリニック
先日(2017-10-18)の記事「ImageJ 学習:CLAHEでコントラスト調整」で、

  Re-ImageJで学ぶ!

  インナービジョン連載中のリジット 山本修司「ImageJで学ぶ実践医用・
  バイオ画像処理」を自分の勉強のためにリメイクした「Re-ImageJで学ぶ!」を
  開設いたしました。 画像解析を学ぶ学生や、ImageJの使い方を忘れてしまった
  研究者の方まで、広く読んでいただければ幸いです。


と云うサイトの1ページを参照した。


改めて、このサイトを確認した。

はじめに -Re-ImageJで学ぶ!-」ページでは、

  はじめまして、VISブログ担当です。

  この度、ImageJを使った壮大な医用画像処理/解析の探求をブログにしようという
  強い思いから、インナービジョン連載中のリジット 山本修司「ImageJで学ぶ
  実践医用・バイオ画像処理」を自分の勉強のためにリメイクした
  「Re-ImageJで学ぶ!」を開設いたしました。

  画像解析を学ぶ学生や、ImageJの使い方を忘れてしまった研究者の方まで、
  広く読んでいただければ幸いです。
  温故知新で何かお役に立てる情報をお届けできれば嬉しい限りです。
  そして、VISブログ担当も、この記事を書くことで、ImageJの片鱗に触れて、
  画像解析を再考していきたいと考えています。

  よろしくお願いいたします。

  作成:2015/7/14
  場所:VIS事務所にて


  本ブログの運用について

  ・本ブログは、インナービジョン連載中のリジット 山本修司「ImageJで学ぶ
   実践医用・バイオ画像処理」を自分の勉強のためにリメイクしたものです。
  ・更新は不定期です。
  ・記事の内容に対する建設的なコメントは歓迎いたします。
  ・プライバシーポリシーは、VISのプライバシーポリシーに準じます。

  その他、追記事項があればここに追記いたします。


と云うことで、


  目次

  はじめに -Re-ImageJで学ぶ!-
  第1回 ImageJってどんなソフトウェア?で学ぶ!
  第2回 ImageJのインストールと医用画像表示で学ぶ!
  第3回 いろいろな書式の画像データを理解しようで学ぶ!
  第4回 医用画像の基本的な性質を知ろう(その1)で学ぶ
  ・・・・・
  ・・・・・
  第67回 ImageJによるOpenCVの利用で学ぶ!
  第68回 ImageJによる粒子画像流速測定法の利用で学ぶ!
  第69回 ImageJを用いたDNAマイクロアレイの画像解析で学ぶ!

  第70回 ImageJを用いたBoneJの紹介で学ぶ!


とあった。


これは、参考にするには大変有用な記事ダ。

頑張って学習しよう!


本日はここまで。


ImageJ 学習は続く?!


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


171007

ゼロのゼロ乗は?

2017-10-20 :  PCクリニック
ふとしたことから、ゼロのゼロ乗はチャント(?)計算できるのか?
と云う疑問点が出てきた。

確認してみた。

先ずは、ウィキペディア:
0の0乗
  0 の 0 乗(ぜろのぜろじょう、英: ・・・ )は、
  累乗あるいは指数関数において、底を 0、指数を 0 としたものである。
  通常、指数関数 a^x は実数 ( 1 ≠ ) a > 0 と x に対して定義されているため、
  0^0 はこの意味では定義されていない。
  その値は、指数の 0 が「非負整数の 0」であるような場合には、
  1 と定義しておくと便利であることが多い一方で、
  「実数あるいは複素数としての 0」であるような場合には、
  例えば二変数関数 x^y を考えれば分かるように、原点 (x,y) = (0,0) において
  自然な(二変数関数として連続となる)定義は存在しない。

  ・・・・・
  ・・・・・


<紙>的には、0^0 は、1 ですネ。


それで、幾つかの処理系で確認:

(1) lua: Lua 5.2.2
  print( 0^0 ) ・・・ チャント 1 となった。

(2) luajit: LuaJIT 2.0.2
  print( 0^0 ) ・・・ チャント 1 となった。

(3) gsl-shell: GSL Shell 2.3.1
  0^0 ・・・・・ チャント 1 となった。

(4) python: WinPython 2.7.6.3
  0**0 ・・・・・ チャント 1 となった。

(5) js: SpiderMonkey 54.0a1
  0^0 ・・・・・ ダメだ。 0 とでた。

(6) Perl 5.14.2
  0**0 ・・・・・ チャント 1 となった。

(7) Mathematica 6.0
  0^0 ・・・・・ エラー:"不定式0^0が見付かりました."

(8) MS-Excel 2002 / Kingsoft Spreadsheets 2013
  +0^0 ・・・・・ エラー:#NUM! / #NUM

(9) KaleidaGraph 4.1J
  0^0 ・・・・・ ダメだ。 0 とでた。


本日はここまで。


思いつくままのランダムな 学習も続く。


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


171003,07

ImageJ 学習:CLAHEでコントラスト調整

2017-10-18 :  PCクリニック
某雑誌(論文?)を立ち読みしていたら、気になる記事があった。

記事のタイトルは忘れたが、キーワードとしては、
ImageJコントラストCLAHE
があった?様な

それで、
「ImageJ コントラスト CLAHE」で検索してみた。

“Re - ImageJで学ぶ!”の
第61回 ImageJによるコントラスト調整の応用-CLAHEについてで学ぶ!
が見つかった。

立ち読みしたのは(多分)この記事にある“参考記事”でしょう?

で、
このページは、・・・・・

 Re-ImageJで学ぶ!

 インナービジョン連載中のリジット 山本修司「ImageJで学ぶ実践医用・
 バイオ画像処理」を自分の勉強のためにリメイクした「Re-ImageJで学ぶ!」を
 開設いたしました。 画像解析を学ぶ学生や、ImageJの使い方を忘れてしまった
 研究者の方まで、広く読んでいただければ幸いです。


と云うサイトの連載記事で、

 2015年12月10日木曜日
 第61回 ImageJによるコントラスト調整の応用ーCLAHEについてで学ぶ!
 この記事は参考記事を援用して、筆者の考えも交えつつ、記述しています。

ですね。

若干(殆ど全て?)引用させて頂く。


 ImageJの標準の画像処理機能の中には、ヒストグラムを均一にして
 コントラストを調整するメニューもありますが、
 同じ画像の中でも濃淡コントラストが極端に異なる領域が存在する場合、
 画像ノイズも強調されてしまい、
 期待通りの画像処理結果が得られないことがあります。
 このような場合に、ユーザー側で許容できるノイズレベルや、
 画質を調整できるコントラスト制御機能があれば非常に便利です。

 今回は、このコントラストの均一化について、
 パラメータの調整が可能な”CLAHE”(コントラスト制限付適応
 ヒストグラム均一化/均等化)について説明します。
 医用画像処理の応用として、CLAHE処理は、放射線治療の分野で使用される
 リニアックグラフィ(ポータルイメージ)やマンモグラフィなど
 にも適応されています。


 CLAHEとは

 ヒストグラム均一化処理は、処理対象となる画像全体に機能しますが、
 コントラスト制限付適応ヒストグラム均一化/均等化処理
 (Contrast Limited Adaptive Histogram Equalization:CLAHE)は、
 画像内のtilesと呼ばれる分割されたブロックごとに処理をすることで、
 画像の局所領域のコントラストを強調し、細部の可視性を高める手法です。
 CLAHEは局所領域のノイズの過剰な増幅を抑えた強調処理
 ができるといわれています。

 CLAHEでは、分割されたtileに対して、近似的かつ最適なヒストグラムの
 コントラストになるよう自動濃淡調整を行います。
 この処理の際、計算ブロックごとの境界にアーチファクトが生じるため、
 双一次内挿(バイリニア補間)を使って、近傍のtileに補間処理をかけます。

 ImageJでは、Stephan Saalfeld氏によって開発されたCLAHEプラグイン( ・・・ )
 が用意されており、通常のヒストグラム均一化と一味違う結果が得られます。
 以下にCLAHEのコントロールパラメータを示します。
 ・ブロックサイズ:画像を分割するtileのサイズの決定。
  目安として画質を維持したい対象のサイズよりも大きな
  ブロックサイズを選択すと良い。
 ・ヒストグラムのビン数:8および24ビットカラー(RGB)のみ
  対応のヒストグラムで、ビン数はtileのピクセル数よりも小さく
  設定しなければならない。
 ・最大スロープ:強度伝達関数(intensity transfer function)による
  コントラスト伸張の制限を決める。
  この値の1は、元画像を基準として、それよりも大きな値を入力する
  ことによって画像局所の最大コントラストを決定する。

 ・・・・・
 ・・・・・
 ・・・・・

 図は、前述の比較例をImageJのSNR計測プラグインを用いて定量的に行った例です。

 ・・・・・
 ・・・・・

 それぞれ、オリジナルを元画像(リファレンス)として
 SNR(Signal-to-noise ratio)、PSNR(Peak signal-to-noise ratio)、
 RMSE(Root mean square error)、MAE(Mean absolute error)を
 求めた値を示しています。

 CLAHEでtileを細かくしていくほど、
 すべてのデータが元データと比べて改善していることがわかります。
 tileなどの設定値や解析対象物によって使い分けをすると、
 より良い結果が導けるかもしれません。
 腹部MRI画像での処理例では、かなり改善されるようです。

 ・・・・・
 ・・・・・

 参考記事:「山本修司:ImageJで学ぶ実践医用・バイオ画像処理.
       INNERVISION(25・11) 2010, p114-115」

 ・・・・・
 ・・・・・


本日はここまで。


ImageJ 学習は続く?


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


171004

DICOM ファイルを TIFF に変換

2017-10-16 :  PCクリニック
前(2017-10-13)の記事「MRIConvert 使って DICOM から TIFF に変換」では、
  ・・・・・
  ・・・・・
  .dcmファイルを入力して、
  .niiファイル経由で、
  16bit .tifファイルに変換する。

  条件としては:
  ・・・・・
  ・・・・・
  ・・・・・

と云うことで、一応のモノが出来た。

だが、
先月(2017-09-13)の記事「DICOM 学習:ファイル読み込み
で書いたコードを流用すれば、.niiファイル経由もイラナイ?

と云うことで、作ってみた:
----- DICOM_to_TIFF.gsl -----
require'pl'; require'cv2_a'; 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)

Fname = 'x.dcm'; IN = io.open( Fname, '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==0x0010 then xx = uint16(val)[0] end
if e==0x0011 then yy = uint16(val)[0] end
if e==0x0100 then bpp= uint16(val)[0] end
end
----------------

g = ReadUInt16()
end

IN:close()

if bpp ~= 16 then print( 'Not 16bits' ); _=io.read(1); os.exit() end

-----------------------------------------------
_=path.currentdir() -- 'pl' で 'lfs' を使う為の準備
SZ = lfs.attributes( Fname, 'size' ) -- ファイルサイズ

IN = io.open( Fname, 'rb' )
zzz = IN:read( SZ - xx*yy*2 )
AT = uint16( IN:read('*a') ) -- Read xx*yy*2
IN:close()

require'cv2_a'
tif = cv2.cvCreateMat( yy, xx, CV_16UC1 )
BT = ffi.cast( 'uint16_t*', tif.Byte )

for n=0,xx*yy-1 do
BT[n] = AT[n] + 0x8000 ------------------
end

if string.find( Fname, 'dcm' ) ~= nil then
FN = string.gsub( Fname, '.dcm', '.tif' )
else
FN = Fname..'.tif'
end
cv2.cvSaveImage( 'o-'..FN , tif, 0 )
これで、・・・・・

これで、
.dcmファイルを 16 bit TIFFファイルに変換。
そこそこ汎用で???


本日はここまで。


DICOM 学習は続く?


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


170822,1005

MRIConvert 使って DICOM から TIFF に変換

2017-10-13 :  PCクリニック
前々回(2017-10-09)の記事「MRIConvert files / mcverter」で書いた如く、
  ・・・・・
  ・・・・・
  結論としては、<紙>的には
  .dcmファイルを、.niiファイルに変換するのなら、
  “MRIConvert”のmcverter.exeで決まりでしょうか。
  ・・・・・
  ・・・・・

と云うことで、

.dcmファイルを入力して、
.niiファイル経由で、
16bit .tifファイルに変換する。

条件としては:

入力 DICOM 画像は、
16ビットで、リトルエンディアン(little-endian)
そして、(多分)無圧縮

画像サイズは、(多分)任意
そして、カレントに「mcverter.exe」と、
対象の“.dcm”ファイルを置く。


テストデータとして、例の 'x.dcm' を入力し、
結果は 'x.tif' とする。
中間に 'x.nii' を作る。

そう云うことで、出来たコードは:
----- dcm_nii_tiff16.gsl -----
in_DICOM, out_TIFF = 'x.dcm', 'x.tif'
tmpF, tmp_nii = 'x', 'x.nii'
--============================================
require'pl'; require'cv2_a'

Byte = |x| ffi.cast( 'uint8_t*', x )
uint16 = |x| ffi.cast( 'uint16_t*', x )

ppp = string.format( '/o . /F %s /f nifti /n %s', tmpF, in_DICOM )
os.execute( 'mcverter.exe ' .. ppp )

_=path.currentdir() -- 'pl' で 'lfs' を使う為の準備
SZ = lfs.attributes( tmp_nii, 'size' ) -- ファイルサイズ

IN = io.open( tmp_nii, 'rb' )
ptr = Byte( IN:read(SZ) ); IN:close()

H = uint16( ptr ); xx, yy = H[21], H[22]

-------------------------------------------
AT = uint16( ptr + SZ - xx*yy*2 )

require'cv2_a'
tif = cv2.cvCreateMat( yy, xx, CV_16UC1 )
BT = ffi.cast( 'uint16_t*', tif.Byte )

for n=0,xx*yy-1 do
BT[n] = AT[n] + 0x8000 --------------
end

cv2.cvSaveImage( out_TIFF , tif, 0 )

file.delete( tmp_nii )
file.delete( tmpF..'_info.txt' )
と云うことで良さそう。

備考:
(1) コードの途中で:
   _=path.currentdir() -- 'pl' で 'lfs' を使う為の準備
  とあるが、・・・
  コメントの通り、
  requireするのは、plだけだが、
  LFSを使いたい為、pl.pathを(ダミーで)使う。
  ( pl.path モジュールは、LFS を使っている )

(2) 配列 AT は、
  読み込んだファイルの後ろから必要数としている。

(3) 画像データ値は、
  符号付の -2048~1965 じゃなくて、
  符号無しの 30720~34733 となる。


本日はここまで。


DICOM 学習は続く?


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


170925

nii ファイルとは何?

2017-10-11 :  PCクリニック
このところ、“DICOM 学習”を行っている???

そこには、拡張子が“.nii”のファイルが出てくる。

ここで、
改めて“.nii”ファイルについて学習した。


以前(2017-09-25)の記事:
… XMedCon:The project stands for Medical Image ・・・」で、
変換先のフォーマットとして、
“nifti”即ち、NIfTI Analyze を指定すると
.niiファイルが出来た。


それで、手始めに
DICOM NifTI format」で検索してみた。

最初のページでは、・・・

 ・DICOM to NIfTI converter, NIfTI tool and viewer - File Exchange ...
 ・Siemens DICOM sort and convert to NIfTI - File Exchange - MATLAB ...
 ・dcm2nii DICOM to NIfTI conversion - Center for Advanced Brain ...
 ・SPM/DICOM - Wikibooks, open books for an open world
 ・NIfTI-1 FAQ - Neuroimaging Informatics Technology Initiative - NIH
 ・The NIFTI file format | Brainder.
 ・dcm2nii DICOM to NIfTI conversion
 ・Tutorial 2: Converting and preparing data - MRI-TUTORIAL.COM
 ・dicomnifti - converts DICOM files into the NIfTI format - Debian ...
 ・How can one convert Nifti to DICOM for DTI images? - ResearchGate

と云ったように、
“DICOM”から“NIfTI”への変換に関するモノが多い?


ならばと、
NIFTI file format」で検索してみた。

最初のページでは、・・・

 ・NIfTI-1 Data Format - Neuroimaging Informatics Technology Initiative
 ・NIfTI-1 header file - NIH
 ・NIfTI-1 FAQ - Neuroimaging Informatics Technology Initiative - NIH
 ・NIfTI: - Neuroimaging Informatics Technology Initiative
 ・NIfTI-1 File Format - NIH
 ・NIfTI-1 Test Data Sets - Neuroimaging Informatics Technology ...
 ・The NIFTI file format | Brainder.
 ・The NIFTI-2 file format | Brainder.
 ・the nifti-1 data format - NITRC
 ・NIfTI conversion (volumetric files) - BrainVoyager Support

と云ったようなページが見つかる。

中から適当に
The NIFTI file format | Brainder.」を選んで見てみた。

  The Neuroimaging Informatics Technology Initiative (nifti) file format
 was envisioned about a decade ago as a replacement to the then widespread,
 yet problematic, analyze 7.5 file format.
  The main problem with the previous format was perhaps the lack of
 adequate information about orientation in space,
 such that the stored data could not be unambiguously interpreted.
  Although the file was used by many different imaging software,
 the lack of adequate information on orientation obliged some,
 most notably spm, to include, for every analyze file,
 an accompanying file describing the orientation,
 such as a file with extension .mat.
  The new format was defined in two meetings of the so called
 Data Format Working Group (dfwg) at the National Institutes of Health (nih),
 one in 31 March and another in 02 September of 2003.
  Representatives of some of the most popular neuroimaging software agreed
 upon a format that would include new information, and upon using the new
 format, either natively, or have it as an option to import and export.
=== Google 翻訳
  Neuroimaging Informatics Technology Initiative(nifti)ファイル
 フォーマットは、10年ほど前に広まっているがまだ問題の多い7.5の
 ファイルフォーマットの代わりに考えられていた。
  以前の形式の主な問題は、おそらく、宇宙での向きに関する適切な情報が
 不足していて、記憶されたデータを明確に解釈できないことでした。
  ファイルは多くの異なるイメージングソフトウェアで使用されていましたが、
 オリエンテーションについての適切な情報が不足しているため、
 分析ファイルごとに、拡張子.matのファイルなど、
 オリエンテーションを記述する添付ファイルを含める必要がありました。
  新しいフォーマットは、2003年3月31日、9月2日に国立保健研究所(NIH)で
 開催されたいわゆるデータフォーマットワーキンググループ(dfwg)の
 2回の会議で定義されました。
  最も人気のあるニューロイメージングソフトウェア新しい情報を
 含むフォーマットと、新しいフォーマットを使用したときにネイティブに、
 あるいはインポートとエクスポートのオプションとして
 持っていることに合意しました。


イマイチ<紙>には理解できない点もあるが、

NIfTI とは、
“Neuroimaging Informatics Technology Initiative”
のことですか。


そして、少し下の方に、

 Overview of the header structure
  In order to keep compatibility with the analyze format,
 the size of the nifti header was maintained at 348 bytes
 as in the old format.
  Some fields were reused, some were preserved, but ignored,
 and some were entirely overwritten.
  The table below shows each of the fields, their sizes,
 and a brief description.
  More details on how each field should be interpreted
 are provided further below.
=== Google 翻訳
  分析フォーマットとの互換性を維持するために、古いフォーマットのように、
 niftiヘッダーのサイズは348バイトに維持されていました。
  一部のフィールドは再利用され、一部は保存されましたが無視され、
 一部は完全に上書きされました。
  下の表は、各フィールド、そのサイズ、
 および簡単な説明を示しています。
  各フィールドの解釈方法の詳細については、
 後で詳しく説明します。


<紙>が(ファイルダンプ)を見るに、
348バイトの後に、4バイトの未使用?領域があるようだ。

つまり、先頭から 352バイトのヘッダーに続いて
16ビット・データがあると見てとれる。


ヘッダー情報で欲しいのは、・・・・・

  TYPE  NAME   OFFSET SIZE  DESCRIPTION

  short  dim[8]  40B  16B   Data array dimensions.


ここの、次元数、サイズ(次元分) ですネ。
例えば、 3   512、512、1、・・・


本日はここまで。


DICOM 学習は続く。


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


170917

MRIConvert files / mcverter

2017-10-09 :  PCクリニック
前(2017-10-06)の記事「dcm2niix:DICOM to NIfTI conversion」では、
  ・・・・・
  ・・・・・
  Important note: dcm2nii is obsolete.
  While I hope it is generally robust and useful,
  active development has moved to dcm2niix.
  ・・・・・
  ・・・・・
などと書いていた。


dcm2nii:MainPage」をよくよく見ていたら、

9 Alternatives

7番目に、
 ・ Jolinda Smith's mcverter is written in C++,
    and has great support for various vendors.
   It attempts to preserve diffusion gradient information.
とある。

この“mcverter”とは?
MRIConvert files

取り敢えず、
MRIConvert-2.1.0-win32.zip
をダウンロードしてみた。

  2016-02-05 付  2.91MB

中には、
2つの .exe ファイル「mcverter.exe」「MRIConvert.exe」と
「~.txt」ファイル2つのみ。

即実行可ダ。

で、<紙>的には「mcverter.exe」1つあれば十分。


例えば、
カレントにある“x.dcm”を入力して、
カレント dir に、NIfTI 形式の“.nii”ファイルを作る
コマンドは
mcverter.exe  /o .  /f nifti  /n  x.dcm
または、
mcverter.exe  --output="."  --format="nifti"  --nii  x.dcm
で出来る。
正確には、
“KH16-6_St6_Sb4-10R_s_20170313_011_002___Vol_0_5_Vol.nii”
“KH16-6_St6_Sb4-10R_s_20170313_011_002___Vol_0_5_Vol_info.txt”
が出来る。

“.nii”は“NIfTI”形式で、

画素の値は:-2048(=30720)~1965(=34733)
と、“dcm2niix”と同じく真の値。
( XMedCon より good )

Y軸上下は、“XMedCon”と同じく見た目通り
( dcm2niix の様に 逆じゃない )

そして、“.exe”1つで済む。


なお、
“.txt”は、画像の情報で、
“dcm2niix”より多い。



結論としては、<紙>的には
.dcmファイルを、.niiファイルに変換するのなら、
“MRIConvert”のmcverter.exeで決まりでしょうか。



本日はここまで。


DICOM 学習は続く。


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


170821

dcm2niix:DICOM to NIfTI conversion

2017-10-06 :  PCクリニック
前(2017-10-04)の記事「DICOM 学習:参考サイト」の最後に載せたサイト:
DICOM introduction and free software

の(ほぼ)最終段に、

  Links to DICOM image conversion
  ・ dcm2nii can convert DICOM images to the popular NIfTI file format
   (other excellent converters are also listed on the dcm2nii page).

が載っている ( この段落、最初に列挙されているリンクには載っていない? )


それで、飛んでみた。

 dcm2nii DICOM to NIfTI conversion

 Introduction

 Important note: dcm2nii is obsolete.
 While I hope it is generally robust and useful,
 active development has moved to dcm2niix.
 In general, dcm2niix is typically better suited for modern DICOM images.
 On the other hand, dcm2nii is useful for archival studies with
 legacy proprietary format that predated DICOM.
 This software is provided under the BSD 2-Clause license.

 ・・・・・
 ・・・・・

つまり、
dcm2niiは古いモノで、今ならdcm2niixを使う。


これは如何か?


ダウンロードした:
 「dcm2niix_19-Aug-2017_win.zip」 2017-08-19 付 609KB
  中身は実質 dcm2niix.exe 1つ。

これ、即実行可能ダ。

試しに、
カレントに“dcm2niix.exe”と、(例の)“x.dcm”を置いて、

dcm2niix.exe  .
と打ち込むと、
2つのファイルが出来た:
“___Vol_0.5_Vol._20170313150941_2.json”
“___Vol_0.5_Vol._20170313150941_2.nii”

“.json”はテキスト・ファイルで、“.dcm”の情報
“.nii”は、以前(2017-09-25)の記事:
… XMedCon:The project stands for Medical Image ・・・
で書いている“.nii”ファイルとは若干異なる。

画素の値は:-2048(=30720)~1965(=34733)
と、真の値。

だが、上下が反転している!

でも、「.exe」1つのみで済むのは good

二者択一だと、悩むナ。


因みに、コマンドusageは、
usage: dcm2niix.exe [options] 
Options :
-1..-9 : gz compression level (1=fastest..9=smallest, default -1)
-b : BIDS sidecar (y/n/o(o=only: no NIfTI), default y)
-ba : anonymize BIDS (y/n, default y)
-f : filename (%a=antenna (coil) number, %c=comments, %d=description, %e echo number, %f=folder name, %i ID of patient, %j seriesInstanceUID, %k studyInstanceUID, %m=manufacturer, %n=name of patient, %p=protocol, %s=series number, %t=time, %u=acquisition number, %v=vendor, %x=study ID; %z sequence name; default '%f_%p_%t_%s')
-h : show help
-i : ignore derived, localizer and 2D images (y/n, default n)
-m : merge 2D slices from same series regardless of study time, echo, coil, orientation, etc. (y/n, default n)
-o : output directory (omit to save to input folder)
-p : Philips precise float (not display) scaling (y/n, default y)
-s : single file mode, do not convert other images in folder (y/n, default n)
-t : text notes includes private patient details (y/n, default n)
-v : verbose (n/y or 0/1/2 [no, yes, logorrheic], default 0)
-x : crop (y/n, default n)
-z : gz compress images (y/i/n, default n) [y=pigz, i=internal, n=no]
Defaults stored in Windows registry
Examples :
dcm2niix.exe c:\DICOM\dir
dcm2niix.exe -o c:\out\dir c:\DICOM\dir
dcm2niix.exe -f mystudy%s c:\DICOM\dir
dcm2niix.exe -o "c:\dir with spaces\dir" c:\dicomdir
でしょうか?


本日はここまで。


DICOM 学習は続く。


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


170821

DICOM 学習:参考サイト

2017-10-04 :  PCクリニック
備忘録として、DICOM 学習用参考サイトの幾つかを列挙。


DICOM ファイル(Photoshop Extended)

  DICOM(Digital Imaging and Communications in Medicine の略)は、
 医療用スキャンを受信するための最もよく使用される標準です。
  Photoshop Extended を使用すると、DICOM(.dc3、.dcm、.dic または
 拡張子なし)ファイルを開いて使用できます。
  DICOM ファイルには、あるスキャンの各レイヤーを表す複数の
 スライスまたはフレームを含めることができます。

  Photoshop は、DICOM ファイルからすべてのフレームを読み取り、
 Photoshop のレイヤーに変換します。
  また、Photoshop ではすべての DICOM フレームを 1 つのレイヤーの
 グリッドに配置して、3D 空間で回転できる 3D ボリュームとして
 フレームを開くことができます。
  Photoshop では、8、10、12 または 16 ビットの DICOM ファイルを
 読み取ることができます (Photoshop では、10 ビットファイルと
 12 ビットファイルが 16 ビットファイルに変換されます)。

  Photoshop で DICOM ファイルを開くと、Photoshop のツールを使用して、
 ファイルを調整したり、ファイルにマークや注釈を付けることができます。
  例えば、ファイルにコメントを追加するには注釈ツール、
 特定のスキャン領域にマークを付けるには鉛筆ツール、スキャン画像から
 ダストやスクラッチを除去するにはダスト&スクラッチフィルターを使用します。
  ものさしツールまたは選択ツールを使用して画像コンテンツを測定します。

 ・・・・・
 ・・・・・



Viewing DICOM images with GIMP

   I have the latest version if GIMP
  which is able to open up the DICOM images,
  but the images are not clear and not reconstructed properly.
   Is there any specific plugin which can help me?

 →

  You might want to use MicroDicom, it does the reconstruction properly.
  You even have a windowing function.

 ・・・・・
 ・・・・・



Read & convert DICOM image - ImageMagick

   Is it possible to read and convert a DICOM to jpg?
  Although I have successfully installed latest version supporting
  the PHP interface, MagickReadImage() fails to read a dcm file
   (in other formats such as jpg, bmp function works fine).
  ・・・ (ImageMagick 6.4.1 05/16/08 Q16)
  ・・・・・・・・・・

 →

   ImageMagick reads DICOM images.
  There have been enhancements and bug fixes to the DICOM reader
  since your release of ImageMagick.
   The current release is ImageMagick 6.6.0-5.
  If you post a URL to one of your images,
  we will download it and determine if the latest release can
  read it properly or if there is a bug in the DICOM reader.

 ・・・・・
 ・・・・・



DICOM introduction and free software

  The DICOM Standard
   This guide gives is a brief description of the DICOM standard,
  which is commonly used for the transfer and storage of medical images.
  ・ An introduction to the DICOM single-file format
  ・ The DICOM header
  ・ Window center and window width (aka brightness and contrast)
  ・ Links to free DICOM viewers
  ・ Links to free DICOM servers/clients
  ・ Links to sample DICOM images
  ・ Links to DICOM resources

 ・・・・・
 ・・・・・



本日はここまで。


DICOM 学習は続く。


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


170821

YAKAMI DICOM ツール集 ( フリーの DICOM Viewer/・・・ )

2017-10-02 :  PCクリニック
前(2017-09-29)の記事「DICOM 学習:ApolloView Lite」では、
些か失望したので、
Free DICOM Viewer」検索の続き。

YAKAMI DICOM ツール集(フリーの DICOM Viewer/Converter/etc.)
はどうか?

 紹介
  「八上 DICOM ツール集 / YAKAMI DICOM Tools」は、フリーウェアで、
 研究用に DICOM ファイルを扱うためのツール集です。無料でご利用になれます。
 診療用には使用しないでください。

  このパッケージは、以下のアプリケーションと文書を含んでいます。

 アプリケーション
  DICOM Viewer
  DICOM Converter
  File Mover
  Folder Renamer
  DICOM Counter
  Shortcut Maker
  Index Maker
  Table Maker
  PACS Client
  WL/WW Editor
  Gamma Editor
  CLUT Editor
  Combi Editor
  Command-Line Converter
  Conveyer
  共通設定
  レジストリ設定

 文書:
  ・・・・・
  ・・・・・


ダウンロードした:
 「YAKAMI_DICOM_Tools_x86-1.4.5.0.ja.zip」 2014-01-21 付 5.05MB
  中身は実質 YAKAMI_DICOM_Tools.ja.msi 1つ。

インストールした:
  D:/TOOL/YAKAMI_Tools_x86/ 以下に。
   8 Dir と、84 ファイル で、20.9MB
  Path 登録は無し


“DICOM Viewer”は、
その名の通り
 親子ウィンドウ式(MDI)高速 DICOM ビューワープログラム

“DICOM Converter”では、
 TIFF 画像ファイルで出力できるが、8bit

拡張子「.dcm」「.nii」が“DICOM Viewer”に対応付けられた!!!


これも、
<紙>的には、イラナイ な。


本日はここまで。


DICOM 学習は続く。


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


170821

DICOM 学習:ApolloView Lite

2017-09-29 :  PCクリニック
改めて「Free DICOM Viewer」で検索してみた。

“NAVER まとめ”の
無料でつかえるWindowsのDICOMビューアー」が見つかる。

 通常のビューアー
 病院などからもらってきたCD-RにはいったX線検査や超音波検査の画像や
 画像検査施設や大学病院でもらってきたCTやMRIの画像を見ることができます。
 個人的には、X線検査や超音波検査のデータはAppllo View liteを使用して、
 CTたMRIにはYAMAKI DICOMツールを使用しています。
 無料である割には性能もちゃんとしています。

 ApolloView Lite
  操作性は一番だと思います。MPR※はできません。
 通常のDRやCR、超音波検査(フォーマットによっては静止画のみ)ならば問題なし。
 ※ MPRとはmulti planar reconstructionのことで、
  CTなどのボリュームデータから3方向での断面を同時に表示する方法のことです。


とあるので、

 ソフト名: ApolloView Lite 4.16.8.2
 ファイル: ApolloViewLite4160802Setup.zip / 1,653,856Bytes / 2016.08.04

をダウンロードした。

書庫の中身は?
実質インストーラ:“ApolloViewLiteSetup.exe” 1.70MB 1つ。

早速実行(インストール):
(例によって) D:/TOOL/ApolloViewLite/ に。

 ApolloViewLite.exe 他 数ファイル&数フォルダ。

 Path 登録は無し。


実行してみた。

ほぼ表示のみ?

「その他」メニューに、
  「タグリスト表示」
  「ヒストグラム表示」
が有。


出力では、

ほぼ「.dcm」フォーマットのみ?


<紙>的には、イラナイ な。


本日はここまで。


DICOM 学習は続く。


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


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



おきてがみ

最新記事
カレンダー
01 | 2018/02 | 03
- - - - 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 - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

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

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


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

Google Analytics
ブックマーク