2025年1月19日日曜日

DICOMに関するお勉強 chatGPTに聞いてみた(未確認)

 Pythonで脳MRIのDICOMデータから特定の信号強度の領域の体積を測定する方法はいくつかのステップに分けて行うことができます。以下に一般的なプロセスを説明します。

必要なライブラリ

  • pydicom: DICOMファイルを読み込むためのライブラリ。
  • numpy: 数値計算を効率的に行うためのライブラリ。
  • matplotlib: 画像の可視化に使用。
  • scipy: 画像データの解析と処理に使う関数を提供。

ステップバイステップの手順

  1. DICOMデータの読み込み: pydicomを使用して、DICOMファイルを読み込みます。
  2. 画像データの抽出: DICOMオブジェクトから画像データを取り出し、必要に応じて配列形式に変換します。
  3. 閾値の設定: 特定の信号強度に基づいて画像から特定の領域を抽出します。このためには、閾値を設定してその値以上または以下のピクセルを選択します。
  4. ラベリング: scipy.ndimageモジュールのlabel関数を使用して、連続する領域(blob)を識別します。
  5. 体積の計算: 選択された領域のピクセル数を数え、各ピクセルの体積をかけて全体の体積を計算します。ピクセルの体積は、ピクセルの寸法とスライスの厚さから算出します。

サンプルコード

import pydicom
import numpy as np
from scipy.ndimage import label
import matplotlib.pyplot as plt

# DICOMファイルの読み込み
dicom_file = 'path/to/your/dicom_file.dcm'
ds = pydicom.dcmread(dicom_file)

# 画像データをnumpy配列に変換
image = ds.pixel_array

# 閾値を設定して領域を選択
threshold = 100  # ここで閾値を設定
binary_image = image > threshold

# 領域のラベリング
labeled_image, num_features = label(binary_image)

# 領域の体積計算
voxel_volume = ds.PixelSpacing[0] * ds.PixelSpacing[1] * ds.SliceThickness
volume = np.sum(labeled_image > 0) * voxel_volume

print(f"Total volume: {volume} cubic mm")

# 結果の表示
plt.imshow(labeled_image, cmap='gray')
plt.show()

このコードは、指定された閾値以上の信号を持つ領域を抽出し、その体積を計算して表示します。必要に応じて閾値やその他のパラメータを調整してください。

2022年4月9日土曜日

緊急事案:温湿度センサーを代用せよ

 仕事で使っている機器に不具合。

温湿度センサーの不調が疑われるとのこと。

シマデン TH71から、温湿度指示調整器 SR92が2台つながっている構成。

かなり古い機器であり、

シマデンさんからは、寿命であると断言。代替えを発注、受注生産のため、納期(3)週間とのこと。

しかしこの機械、今止めるわけにはいかんのです。


操作盤


センサー部分 TH71の基板。ぱっと見てオペアンプ、温度センサー、湿度センサーそれ以外はよくわからない。
説明書を見ると、要するに

湿度
0-100% → 0-10mV
温度
0-50度℃ → 0-50mV
が出ればいいようだ。

温湿度センサーは、簡易的ではありますが、以下のものは使用経験があります。



I2Cではありませんがデジタルで読めるものです。
以下のような概略で小さなセンサー電圧変換をでっち上げて接続。




詳細は省きますが
100円ショップのタッパウェアもどきに全部入れ込んで動作させました。



かれこれ一か月になります。途中ハードウェアのバージョンアップを加えつつ、無停止動作しております。

やっと納品、交換作業日が決まったので、もう少しでお役御免ですが、
趣味が役にたった、とも言えます。

本機、ポイントは、4726はI2Cアドレスが変えられないので、二つ出力するのであれば、4725のほうがよいということです。

あとはライブラリを組み合わせて出力を得るだけです。

スケッチ、詳細回路図は省略します。

必要な方が万が一おられましたら、コメントください。





2022年4月4日月曜日

Apple Thunderbolt display ケーブル交換でなおるか?

 メインのデスクトップの画面はThunderbolt display二台なんですが、片方を認識しなくなってしまいました。

多くのサイトで、ケーブル交換で治る、と書いてあります。

8万円ぐらいの製品ですが、同じ大きさの普通のモニタは20000円ぐらいで買えるし、何より軽いんですよね。

治すかどうかしばらく悩みつつ、apple cinema displayをつないでごまかしていましたが

やはり同じ大きさじゃないと並べて使うのは難しい。

いよいよ修理を決心しました。


これ。いつもは納期などあまり気にしないのですが、現在いろいろな注文が届かないのでそこはかとなく気にしていました。
10日程度で到着。梱包はきちんとしていました。
たしかにブラケットが壊れていますがその意味するところは不明です。B級品ってことですかね。

早速分解。交換です。
T10 T6だけあればできます。シールをはがす何かがあってもいいです。

参考にしたところは、

https://ssilab.co.jp/blog/tech-blog/tech-blog-child/exchange-thunderboltdisplay-cable

https://www.ifixit.com/Guide/Apple+Thunderbolt+Display+Thunderbolt+&+MagSafe+Cable+Replacement/112355

あたりです。
こういうサイトはいつまで保存されているのでしょかね。

手順もサイトの通りです。
表面の画面(磁石でくっついている)を起こしてはがします。



サイトの案内のとおり、コネクタを慎重に外していきます。
最後は、接地なのか、ねじでとまっているところを外します。短めのT10
があると便利です。 液晶を外します。




ifixitのほうがたくさんねじを外しますが、本来不要なところかもしれません。
外したのは電源コネクタ、スピーカーです。


ロジックボードの電源コネクタと、温度センサーのコネクタを外して、7か所のT10ねじを外して裏返すと、thunderbolt ケーブルが基板に刺さっているとこらあります。

ここだけT06です。

さらに、ブラケット周りのねじを外して、ケーブルを引き抜きます。


新規購入品の登場です。


たしかにbroken blacketですが、実用上は金属板で押さえるので、あまり問題ないような気がします。


新旧並べてみます。書いてある番号はちょっと違います。


元の位置に配置して、固定の金属板をねじ止め。


Thunderbolt ケーブルを取りまわして、ロジックボードに差し直し、T06ねじ2本でコネクターを再度覆います。


あとは逆の順番で元通り。
電源コネクタを固定、スピーカーを固定。スピーカのコネクタをさして、
基板のコネクタをさし、元の位置でねじ止め。
液晶のコネクタをねじx1、コネクタ3を戻す。

あっさり認識して、一応治った。ようです。
なお、母艦はMac mini 2012。

しばらく使えるかな。









2022年1月5日水曜日

親子時計(設備時計)をうごかす 3 パルス発生装置

 Arduino + RTC + Hブリッジで行けそうかと思っております。

とり合えず書いたスケッチを。


#include <DS3232RTC.h>           

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3F, 16, 2);

const char *weekStr[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

const int DIN_PIN = 8;


void setup() {

  // use pins for pulse

  pinMode(DIN_PIN, INPUT_PULLUP );

  pinMode(6, OUTPUT);

  pinMode(7, OUTPUT);


  ///// 時刻の設定 /////

  // 時刻設定時のみ以下2行のコメントアウト(//)する

  //  setTime(12, 26, 30, 14, 1, 2022);  // 時,分,秒,日,月,年の順で設定

  //  RTC.set(now());  

  setSyncProvider(RTC.get);  

  lcd.init();                          

  lcd.backlight();

}


void loop() {


 int value;

  value = digitalRead( DIN_PIN );



  //早送りモードの条件 pin8をアースに落とす 5秒で2パルス

  if (value == LOW) {

    digitalWrite(6, HIGH);

    digitalWrite(7, LOW);

    delay (2000);

    digitalWrite(6, LOW);

    digitalWrite(7, LOW);

    delay(1000);

    digitalWrite(6, LOW);

    digitalWrite(7, HIGH);

    delay (2000);

    lcd.init();

    lcd.setCursor(0, 0);

    lcd.print("FORWARD>>>");


  } else

 //以下通常時計動作 

  {

    lcd.setCursor(0, 0);

    lcd.print(year());

    lcd.print("/");

    if (month() < 10) {

      lcd.print("0");

    }

    lcd.print(month());

    lcd.print("/");

    if (day() < 10) {

      lcd.print("0");

    }

    lcd.print(day());

    lcd.print(" ");

    lcd.print(weekStr[weekday() - 1]);

    lcd.setCursor(0, 1);

    if (hour() < 10) {

      lcd.print("0");

    }

    lcd.print(hour());

    lcd.print(":");

    if (minute() < 10) {

      lcd.print("0");

    }

    lcd.print(minute());

    lcd.print(":");

    if (second() < 10) {

      lcd.print("0");

    }

    lcd.print(second());


//秒数が 0,1秒、30,31秒のときだけpin 6,7出力する。(パルス幅2秒)

    if (second() == 30 || second() == 31) {

      digitalWrite(6, HIGH);

    }  else

      digitalWrite(6, LOW);

    if (second() == 0 || second() == 1) {

      digitalWrite(7, HIGH);

    } else

      digitalWrite(7, LOW);

    delay(1000);  // 1秒でループ

  }

}


とりあえずブレッドボードで動作確認。


2022年1月2日日曜日

Elegoo Mars 2 pro ファームウェア アップデート

CHISUBOX V1.8.1(OS X)が極めて不安定で途中で異常終了してしまう。

やむをえず 1.9.にアップデートしたところ、プリンタ側のファームウェアアップデートを余儀なくされた。

いろいろ検索するとちょっと面倒な時もあるようですが、

結局のところ

USBのrootフォルダにファイルをいれて起動する

そのごprintボタンから、二つのファイルを指定する

ということのようです。






いかのような記載があり。再起動。

ファイルの残りをプリントボタンから明示。

てことのようです。

Restart the machine, the update file .SH4 will be updated automatically, after the successful update there will be a beeping sound and restart the machine

④Print the remaining files to be updated on the printer in the following order: .CBD > .txt

Caution: The.SH4 file will be automatically updated after restarting the machine in the shutdown state. 

親子時計(設備時計)を動かす1

ひょんなことから、設備時計の子時計を入手。

arduinoで動かせるかやってみることにしました。

まずは先人たちの記録を探します。


24V/30secのパルスを極性を変えつつ発生させればいいようです。

コンセントから電源は取らざるを得ないでしょうね。


参考にした場所

https://sound-au.com/clocks/arduino.html


 http://atmk.sakura.ne.jp/site2/radio/masterclock.htm


https://www.instructables.com/Arduino-based-master-clock-for-schools/


https://www.instructables.com/Arduino-LCD-Master-Clock/


https://www.marutsu.co.jp/contents/shop/marutsu/mame/64.html


親子時計(設備時計)を動かす2

 

入手した設備時計 の子時計。

SA-22
2000オーム
I.C.-CIRIZEN
とあります。


両面にあって、ラッチでアルミの箱に固定されており、導線が各2本。


文字盤はこんな感じ。