京橋のバイオインフォマティシャンの日常

南国のビーチパラソルの下で、Rプログラムを打ってる日常を求めて、、Daily Life of Bioinformatician in Kyobashi of Osaka

【LINUX/Macの基本コマンド④】cd, cat, head/tailなどのコマンドの使い方メモ

はじめに

ターミナル上で、よく使うであろう基本コマンドを紹介する。

cd、cat、head/tail、chmod、shutdownなどを解説する。

cd : ディレクトリ移動

cd [ディレクトリ]
#このとき、「tab」を押すと、ファイルを表示・補完
#コマンド実行時に、[ ]は不要

#(1) Homeディレクトリに移動
cd

#(2) 絶対パスでHomeからDesktopに移動
cd /Users/Home/Desktop

#(3) 相対パスでHomeからDesktopに移動
cd ./Desktop
#現在(./)のディレクトリの意味

#(4) 相対パスで、DesktopからTestに移動
cd ../Home/other/Test
#1つ上(../)のディレクトリの意味

cat : ファイル内表示・結合・作成

#ファイル内の表示
cat [ファイルパス]
#コマンド実行時に、[ ]は不要

#行番号を付加して、ファイル表示
cat -n [ファイルパス]

#複数ファイルから、結合ファイルを作成(行方向に結合)
cat [ファイルパス1] [ファイルパス2] > [ファイルパス3]
#ex. cat test1.txt test2.txt > test3.txt

#空ファイルの作成(Ctrl + d で終了すること)
cat > [ファイルパス]

#すべての履歴表示、「~ (チルダ)」はHomeディレクトリの意味
cat ~/.bash_history
#OR
history

head / tail : ファイルの先頭や末尾を表示

#ファイルの先頭から、10行を表示
head -n 10 [ファイルパス]

#ファイルの末尾から、10行を表示
tail -n 10 [ファイルパス]

覚えておくと良いターミナルコマンド

#システムを終了する
shutdown -f now
              
#再起動する
reboot

#ユーザーに実行権限を与える
chmod +x [実行ファイルのパス]

#すべてのユーザーに実行権限を与える
chmod a+x [実行ファイルのパス]

#Rootユーザーでコマンドを実行する
sudo reboot

ターミナルコマンド補足編

#日時を表示するコマンド。
date

#2021年のカレンダーを表示する
cal 2021

#アクティブなジョブの表示
jobs

#ジョブモニターの表示
top

まとめ

プログラミング学習には不可欠な、ターミナル操作。

ターミナル操作が、一般的なブラウザ操作よりも扱うのが難しい理由は、文字で操作するというコマンドラインインターフェイス(CUI)というそもそもの操作体系の違いにある。

また、ターミナルを使いこなすには、Linuxの基本コマンドを覚えることが必要もある。 LinuxコマンドはLinuxだけでなく、Mac OSでも使えます。

Linuxコマンドを覚えることで、プログラミングスキルが一気に上がることになります。

LINUX/Macの基本コマンドの関連記事

skume.net

skume.net

skume.net

skume.net

skume.net

skume.net

細胞形態デジタルATLASのWebページをまとめてた件〜生体組織や細胞の光顕画像・電顕画像を中心に〜

序章

細胞形態の画像集をATLAS(アトラス / マップ集)としてまとめた教育サイトは、 海外を含めていくつかあるが、 Google検索してもそれらWebサイトに辿り着くのは至難である。

今回、生体組織・細胞の形態学や電顕画像を主なトピックとして、 無料で公開されているものに限って調査して、関連するWebサイトをまとめてみた。動物細胞、植物組織が含まれる。

見つかった電顕画像は、主に透過型電子顕微鏡(TEM)の超薄切片像であり、一部に走査型電子顕微鏡(SEM)で取られたバルク試料像や切片SEM像もある。また、細胞生物学、組織科学の基礎知識を記載しているページもあわせて掲載した。

今回調査した印象としては、純粋に、電顕写真だけの解説を見たいなら、Workshop Anatomy for the Internetが良いだろう。

また、組織科学の解説も確認したいなら、Michigan Histology and Virtual Microscopy Learning Resources が良いだろう。

20210年8月4日更新。随時更新予定。

日本国内 (無料公開)

理研微細構造画像メタデータベース(RIKEN MIM)

マウス
ラット

短評: 網羅的組織微細構造解析(モルフォミックス)のプラットフォーム。組織切片の広域SEMデータが公開されている。

東京医科歯科大学 教養部 生物学分野

短評: 細胞構造の解説、細胞構造イラストと組織科学・電顕写真

短評: 細胞構造の解説、細胞イラストと電顕写真

海外 (無料公開)

Biology 130 Lab Review Images, University of Wisconsin

Laboratory 3 : The Plant Cell

短評: 植物細胞の光顕・電顕画像。

ATLAS of PLANT and ANIMAL HISTOLOGY, Dpt. of Functional Biology and Health Sciences, Faculty of Biology, University of Vigo, Spain

短評: 細胞生物学の解説、光顕・電顕画像。サイトデザインが良い。

The Internet Pathology Laboratory for Medical Education hosted By Eccles Health Sciences Library, The University of Utah

短評: 正常細胞の構造、HIV粒子、Neoplasms、腎病変などの電顕像。

Michigan Histology and Virtual Microscopy Learning Resources, University of Michigan Medical School

サブセクション

短評: 電顕画像、組織科学の解説がよく纏まっている。

Virtual Histology, Dartmouth Medical School, Dartmouth College

サブセクション

短評: WSIが多い。電顕画像は細胞や組織の種類が豊富。

HUMAN STRUCTURE VIRTUAL HISTOLOGY, Indiana University School of Medicine

短評: 解説と組織画像が丁寧に纏められている。次ページへのスクロールがやや面倒。

Workshop Anatomy for the Internet - English homepage -, Editor: Privatdozent Dr. med. habil. Holger Jastrow, Specialist in Anatomy

サブセクション

短評: 様々な電顕画像が堪能できる。素晴らしい。

The Histology Guide, Faculty of Biological Sciences, University of Leeds

短評: 細胞生物学の解説と写真のバランスは良い。デザインは良い。

SBPMD Histology Laboratory Manual, Columbia University College of Physicians and Surgeons

短評: 解説が主。Webビューアに飛ばない。。

Image Galleries, Biomedical Imaging Unit, Laboratory and Pathology Block, Southampton General Hospital, University of Southampton

短評: 画像が主。綺麗だけど、画像少なめ。

the University of Oklahoma Health Sciences Center Interactive Histology Atlas

短評: 主に光顕のAtlas。

Cell Image Library, Center for Research in Biological Systems, University of California San Diego

短評: たくさん画像データがある。撮像モダリティなどのメタデータが充実。

Histology Guide, Virtual microscopy laboratory (T. Clark Brelje and Robert L. Sorenson.)

短評: 5 Aug 2021に追加。細胞生物学の解説と電顕画像がうまくマージされている。

Selected Websites, Anatomy & Physiology Guide, Campus Library, University of Washington Bothell & Cascadia College

短評: 5 Aug 2021に追加。学生用のまとめサイト。

Histology Text Atlas Book, visualhistology.com

短評: 5 Aug 2021に追加。教科書的な内容がまとまっている。

付録 - 有料画像集

短評: マニアックにも電顕写真がある。ライセンスは細かく分かれている。やや高めな印象。

【R言語での画像処理シリーズ(その1)】R/EBImageとかを使った画像処理(読み込み、表示、リサイズetc)をやってみた件

はじめに

今回は、EBImageimagerを使った、 R環境での画像処理をいろいろと紹介する。

具体的に、画像ファイルの読み込み・表示、 ヒストグラム表示、グレー画像変換、リサイズ(縮小)とかのプログラムを作成・実行してみた。

はじめに、EBImageimagerをセットアップする。

パッケージのインストール

#EBImageのインストール
install.packages("BiocManager")
BiocManager::install("EBImage", force = TRUE)

#imagerのインストール
install.packages("imager")

ひまわり画像をwikipediaからダウンロードして表示する

download.file関数を使って、Wikipediaからヒマワリの画像をダウンロードする。

そして、EBImageの関数群(readImage & display)を使って、読み込みと表示をやってみる。

#画像のダウンロード
download.file(url = "https://upload.wikimedia.org/wikipedia/commons/4/40/Sunflower_sky_backdrop.jpg", 
              destfile = "sunflower.jpg")

#EBImageのロードとオプション設定
library(EBImage); options(EBImage.display = "raster")

#画像の読み込み
Img <- EBImage::readImage(files="./sunflower.jpg", type = "jpg")

#画像の表示
EBImage::display(Img)

#画像の保存
quartz.save("Img01_sunflower.png", type="png", dpi=100); dev.off()

RGB画像をヒストグラムで表示する

次は、RGBのそれぞれの成分で頻度分布を計算して、ヒストグラムとして表示させる。

#クラス表示
str(Img)
#Formal class 'Image' [package "EBImage"] with 2 slots
#  ..@ .Data    : num [1:1404, 1:1555, 1:3] 0.00392 0.00392 0.00784 0.00784 0 ...
#  ..@ colormode: int 2
#  ..$ dim: int [1:3] 1404 1555 3

#画像の前処理
a <- hist(unlist(Img[,,1]), breaks=256); dev.off(); a <- a$red$density      #Red
b <- hist(unlist(Img[,,2]), breaks=256); dev.off(); b <- b$red$density      #Green
cc <- hist(unlist(Img[,,3]), breaks=256); dev.off(); cc <- cc$red$density   #Blue

#画像のヒストグラム表示
plot(a, 
     xlim = c(0,256), ylim=c(0, max(c(a, b, cc))*1.1),
     xlab="Intensity value (0-255)", ylab="Density", xaxs="i", yaxs="i",
     type="l", col="red")
lines(b, col="green")
lines(cc, col="blue")
quartz.save("Img02_rgb_histo.png", type="png", dpi=100); dev.off()

グレー画像をヒストグラムで表示する

ここでは、RGBのカラー画像をグレー画像に変換した後に、頻度分布を計算して、ヒストグラムとして表示させる。

まずは、カラー画像をグレー画像に変換する。

#詳細表示
Img
#Image 
#  colorMode    : Color 
#  storage.mode : double 
#  dim          : 1404 1555 3 
#  frames.total : 3 
#  frames.render: 1 
#
#imageData(object)[1:5,1:6,1]
#            [,1]        [,2]        [,3]        [,4]        [,5]        [,6]
#[1,] 0.003921569 0.003921569 0.003921569 0.003921569 0.003921569 0.003921569
#[2,] 0.003921569 0.003921569 0.003921569 0.003921569 0.003921569 0.003921569
#[3,] 0.007843137 0.007843137 0.007843137 0.007843137 0.003921569 0.003921569
#[4,] 0.007843137 0.003921569 0.003921569 0.003921569 0.003921569 0.003921569
#[5,] 0.000000000 0.003921569 0.003921569 0.003921569 0.003921569 0.003921569

#グレーに変換
ImgGr <- array(EBImage::channel(Img, "gray"), dim = dim(Img)[1:2])

#詳細表示
ImgGr
#Image 
#  colorMode    : Grayscale 
#  storage.mode : double 
#  dim          : 1404 1555 
#  frames.total : 1 
#  frames.render: 1 
#
#imageData(object)[1:5,1:6]
#          [,1]      [,2]      [,3]      [,4]      [,5]      [,6]
#[1,] 0.3124183 0.3124183 0.3124183 0.3124183 0.3124183 0.3124183
#[2,] 0.3124183 0.3124183 0.3124183 0.3124183 0.3124183 0.3124183
#[3,] 0.3163399 0.3163399 0.3163399 0.3163399 0.3124183 0.3124183
#[4,] 0.3163399 0.3124183 0.3124183 0.3124183 0.3124183 0.3124183
#[5,] 0.3084967 0.3124183 0.3124183 0.3124183 0.3124183 0.3124183

EBImage::display(ImgGr)
quartz.save("Img03_sunflower.png", type="png", dpi=100); dev.off()

次に、グレー画像のヒストグラムも合わせて表示してみる。

#画像の前処理
a <- hist(unlist(ImgGr), breaks=256); dev.off()
a <- a$density

#画像のヒストグラム表示
par(mfcol = c(1,2), mgp=c(2.5, 1, 0))
EBImage::display(ImgGr)
plot(a, 
     xlim = c(0,256), ylim=c(0, max(c(a))*1.1),
     xlab="Intensity value (0-255)", ylab="Density", xaxs="i", yaxs="i",
     type="l", col="grey50")
quartz.save("Img04_Grey.png", type="png", dpi=100); dev.off()

RGB画像を各成分に分離して、各画像を表示する

R成分を取り出す場合には、GとB成分にゼロを代入して、GB成分を消去する。 GとB成分でも同じような処理をやってみる。 そして、オリジナル画像、R成分、G成分、B成分の画像を連結させて表示させる。

#RGB色の分離
Red <- Img
Red[,,2] <- 0
Red[,,3] <- 0
#EBImage::display(Red)

Green <- Img
Green[,,1] <- 0
Green[,,3] <- 0
#EBImage::display(Green)

Blue <- Img
Blue[,,1] <- 0
Blue[,,2] <- 0
#EBImage::display(Blue)

#RGB色で表示
EBImage::display(EBImage::combine(Img, Red, Green, Blue),
                 nx=2, all=TRUE, spacing = 0.01, margin = 70)
quartz.save("Img05_rgb.png", type="png", dpi=100); dev.off()

フィルターを変えて、画像の縮小を行い、結果を比較してみた。

EBImage::resizeimager::resizeを使って、 様々なフィルターでの画像の縮小を試してみた。 XY軸方向に、それぞれ20%縮小した(要するに、1/25縮小)。

#縮小 + no-filter
Img_n50 <- EBImage::resize(Img, 
                           w=round(dim(Img)[1]/5, 0), 
                           h=round(dim(Img)[2]/5, 0), 
                           filter="none")

#縮小 + bilinear filter
Img_b50 <- EBImage::resize(Img, 
                           w=round(dim(Img)[1]/5, 0), 
                           h=round(dim(Img)[2]/5, 0), 
                           filter="bilinear")

#EBImageからcimgへのオブジェクト変換
img <- imageData(Img)
img2 <- imager::as.cimg(img, dim=dim(img))
#警告メッセージ: 
# as.cimg.array(img, dim = dim(img)) で: 
#  Assuming third dimension corresponds to colour

#縮小 + no interpolation: additional space is filled according to boundary_conditions (0)
Img_nnia50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 0)
Img_nnia50 <- EBImage::Image(Img_nnia50[,,1,], colormode = "Color")
#EBImage::display(Img_nnia50)

#縮小 + nearest-neighbor interpolation (1)
Img_nni50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 1)
Img_nni50 <- EBImage::Image(Img_nni50[,,1,], colormode = "Color")

#縮小 + moving average interpolation (2)
Img_mai50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 2)
Img_mai50 <- EBImage::Image(Img_mai50[,,1,], colormode = "Color")

#縮小 + linear interpolation (3)
Img_li50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 3)
Img_li50 <- EBImage::Image(Img_li50[,,1,], colormode = "Color")

#縮小 + grid interpolation (4)
Img_gi50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 4)
Img_gi50 <- EBImage::Image(Img_gi50[,,1,], colormode = "Color")

#縮小 + cubic interpolation (5)
Img_ci50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 5)
Img_ci50 <- EBImage::Image(Img_ci50[,,1,], colormode = "Color")

#縮小 +  lanczos interpolation (6)
Img_lani50 <- imager::resize(img2, 
                            size_x = round(dim(img2)[1]/5, 0),
                            size_y = round(dim(img2)[2]/5, 0),
                            interpolation_type = 6)
Img_lani50 <- EBImage::Image(Img_lani50[,,1,], colormode = "Color")

#表示
EBImage::display(EBImage::combine(Img_n50, Img_b50, Img_nnia50, 
                                  Img_nni50, Img_mai50, Img_li50, 
                                  Img_gi50, Img_ci50, Img_lani50),
                 nx=3, all=TRUE, spacing = 0.01, margin = 70)
m <- c(0.8, 1, 0)
text(x = 100, y = 0,
     label = "Img_n50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 380, y = 0,
     label = "Img_b50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 680, y = 0,
     label = "Img_nnia50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 100, y = 310,
     label = "Img_nni50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 380, y = 310,
     label = "Img_mai50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 680, y = 310,
     label = "Img_li50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 100, y = 620,
     label = "Img_gi50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 380, y = 620,
     label = "Img_ci50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
text(x = 680, y = 620,
     label = "Img_lani50", adj = c(0,1), col = "white", cex = m[1], pos=m[2], srt=m[3])
quartz.save("Img06_resize.png", type="png", dpi=150); dev.off()

n50、b50、nni50、gi50の縮小結果はあきらかに画像の平滑化がうまくいってなさそう。

nnia50の縮小結果は端っこしか切り取られていない。。

次に、画像(グレー変換後)のヒストグラムを図示してみる。

#レイアウト設定
par(mfrow = c(3,3), mgp=c(2.5, 1, 0), mai = c(0.5, 0.5, 0.2, 0.2))

#Img
hist(array(EBImage::channel(Img, "gray"), dim=dim(Img)[1:2])*256, 
     breaks=256, freq=F, main="Img", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_n50
hist(array(EBImage::channel(Img_n50, "gray"), dim=dim(Img_n50)[1:2])*256, 
     breaks=256, freq=F, main="Img_n50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_b50
hist(array(EBImage::channel(Img_b50, "gray"), dim=dim(Img_b50)[1:2])*256, 
     breaks=256, freq=F, main="Img_b50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_nni50
hist(array(EBImage::channel(Img_nni50, "gray"), dim=dim(Img_nni50)[1:2])*256, 
     breaks=256, freq=F, main="Img_nni50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_mai50
hist(array(EBImage::channel(Img_mai50, "gray"), dim=dim(Img_mai50)[1:2])*256, 
     breaks=256, freq=F, main="Img_mai50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_li50
hist(array(EBImage::channel(Img_li50, "gray"), dim=dim(Img_li50)[1:2])*256, 
     breaks=256, freq=F, main="Img_li50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_gi50
hist(array(EBImage::channel(Img_gi50, "gray"), dim=dim(Img_gi50)[1:2])*256, 
     breaks=256, freq=F, main="Img_gi50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_ci50
hist(array(EBImage::channel(Img_ci50, "gray"), dim=dim(Img_ci50)[1:2])*256, 
     breaks=256, freq=F, main="Img_ci50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#Img_lani50
hist(array(EBImage::channel(Img_lani50, "gray"), dim=dim(Img_lani50)[1:2])*256, 
     breaks=256, freq=F, main="Img_lani50", xlab="Intensity value (0-255)", 
     xaxs="i", yaxs="i", ylim=c(0, 0.06))

#保存
quartz.save("Img07_histo.png", type="png", dpi=150); dev.off()

ピークの高さとか、諧調150くらいのところに少し違いがありそう。

まとめ

R/EBImage/imagerでの基本的な画像をまとめてみた。

現状、Rでの画像処理のハウツゥはほんと少ない。。

R言語でも画像処理が結構できそうなので、 少しずつスクリプトを紹介できればと思う。

参考資料

bioconductor.org

rdrr.io

www.rdocumentation.org

dahtah.github.io

rdrr.io

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/55.htmlcse.naro.affrc.go.jp

labs.eecs.tottori-u.ac.jp