Learn as if you were to live forever

勉強の記録(画像処理,DeepLearning,ときどき英語)

raw画像を見てみる

今日はRAW画像を読み込んで表示してみるとどう見えるのかを確認してみます。

RAW画像は画像処理が行われていない生の画像で、レンズの収差やセンサーの特性がそのまま記録されています。まだ人の目で見たのとは程遠い画像になっていて、カメラの画像処理エンジンまたは現像ソフトなどで調整する必要があります。

 

この記事ではRAW画像を読み込んで表示するのが目標です。

RAW画像の読み込みについてはMOIZさんの記事を参考にしました。

uzusayuu.hatenadiary.jp

 

最近散歩で撮影したEOSM100のRAW画像を読み込んでみることにします。

以下はRAW画像と一緒に記録したJPEG画像です。

この画像のRAW画像を読み込んでみます

 

画像を読み込む前にRAW画像を読みこむライブラリrawpyをインストールします。

!pip install rawpy

rawpyの詳細については以下のサイトに詳しい説明がありました。

letmaik.github.io

RAW画像のさまざまな情報を抜き出したり補正するプログラムの説明がまとめられていて、画像処理のプログラムを書くときによく参照します。

 

次にいつも通り、読み込みたい画像をアップロードします。

from google.colab import files
uploaded_file = files.upload()
uploaded_file_name = next(iter(uploaded_file))

RAW画像を読み込むと前回JPEG画像を読み込んだ時よりもアップロードに時間がかかります。それはRAW画像には圧縮されていないたくさんのデータが含まれているためです。ローカルで作業すればそういう時間はかからないのにと、google colabの不便さをちょっと感じました。

 

読み込まれたらRAW画像を読み込みます。

import rawpy
raw = rawpy.imread(uploaded_file_name)

この後に行う画像処理のために、rawをコピー*1し、配列にします。

import numpy as np
raw_image = raw.raw_image.copy()
h=raw.sizes.raw_height
w=raw.sizes.raw_width
raw_array = np.array(raw_image).reshape([h, w]).astype('float')

そして画像を表示してみます。

import matplotlib.pyplot as plt
plt.imshow(raw_array/np.max(raw_array))

以下が読み込んだ画像です。

読み込んだRAW画像

暗くて色もJPEG画像とは全然違います。

さらに拡大してみます。

plt.imshow(raw_array[1500:1600,3650:3750]/np.max(raw_array))

x=3650〜3750,y=1500〜1700を切り取りました

画像を拡大してみると市松模様*2になっています。

このraw画像を人の目で見た時のような画像にするためにはこの後いろいろな処理が必要になります。

どんな処理が必要になるかは次の記事に続きます。

 

*1:どうしてコピーするのかは別の時に説明を書く予定です

*2:今回読み込んだ画像はでベイヤーセンサーのカメラなのでRAW画像が市松模様になります。rawpyのドキュメントを見るとFoveonセンサーについての記載もあるのでFoveonセンサーも読み込めるのかもしれません。Foveonセンサーは3層センサーなのでベイヤーセンサーとは違った結果が出てきそうです。機会があったら読み込んでみたいと思います。

画像ができるまで

これからRAW画像に画像処理を行い、前回の記事で見たようなJPEG画像を作ろうと思います。

画像処理では撮影したデータを人の目で見たのと同じように表示できるように様々な処理を行います。

各処理の意味を理解しやすいよう、デジタルカメラの仕組みを勉強しました。

参考にしたのはオーム社から出版されている「デジカメの画像処理」の本です。

www.ohmsha.co.jp

光がカメラに入ってきてからどういう工程を通っていくのかを以下の図にしてみました(今よく使われているミラーレスカメラの構造を書いてみました)。

デジタルカメラの構成

レンズ被写体から反射した光を一点に集めることでピントの合った像をカメラに送り、カメラはレンズから送られてきた光を受け取り、人の目で見たのに近い画像に変換します。

 

カメラは光学フィルター、マイクロレンズ、カラーフィルター、撮像素子(センサー)、画像処理エンジンで構成されています。

光学フィルターは人の目で見ることのできない赤外線と、高周波な成分をカットします。

マイクロレンズで光を効率よく取り入れ、カラーフィルターでRGBに分解し、撮像素子で光が電気信号に変換されRAW画像ができます。

 

RAW画像はレンズの収差やセンサーの特性が含まれており、人の目で見たのとは程遠い画像です。

画像処理エンジンでそのような特性を補正し、その画像が圧縮されてメモリーに保存されたり、カメラのモニターに映し出されます。

 

これから見ていく画像処理は、画像処理エンジンで行われる処理になります。

まずはじめに、RAW画像を表示するとどう見えるのかを次の記事で見てみます。

画像の表示(Matplotlib編)

前回画像の読み込みと表示でOpenCVを使った画像の表示をしたのですが、別の方法での表示の仕方についてです。

今回はMatplotlibという別のライブラリを使って表示をします。

 

Matplotlibについて

Matplotlibはグラフなどを描画するライブラリですが、画像の表示も可能です。

Matplotlib公式サイト

matplotlib.org

Matplotlibは40種類以上のAPIに分かれていて(公式サイトのReferenceのページから全てのAPIを見ることができます)、今回使用したい画像の表示(imshow)は、matplotlib.pyplotというAPIに含まれています。

 

Matpltlibを使った画像の表示

画像の読み込みの前に、画像のアップロードと画像の読み込みを済ませておきます(前回詳しく書いたので説明は省略します)。

Matplotlibを使った画像の読み込みは以下のようになります。

import matplotlib.pyplot as plt
plt.imshow(img)

1行目でmatplotlib.pyplotをインポートしてます。as pltにしているのは、2行目の関数の呼び出しの時にmatplotlib.pyplot.imshowと書くのが面倒なので、matplotlib.pyplotをpltという名前でインポートしています。長い名前のライブラリをインポートするときによく使う方法です。

2行目はimshowで画像を表示しています。

実行すると以下のように画像が表示されます。

f:id:i_knit_you_purl:20220108150621p:plain

画像をopencvのimreadで読み込んだときにBGRの順に信号が読み込まれると書いたのですが、matplotlibのimshowはRGBの順番に信号値が並んでいないと上のようなおかしな色になってしまいます。

なので、画像を読み込む前に信号値の並べ替えをします(BGRからRGBに並び替える)。

img=cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

再度画像を表示してみます。

f:id:i_knit_you_purl:20220108151918p:plain

今度は正しい色の画像が表示されました!

matplotlibによる画像の表示では座標位置が表示されるので、画像解析のコードを書くときの確認などに利用したりしています。

画像の読み込みと表示

プログラミングを勉強しはじめの頃は参考書を順に読んで勉強していたのですが、実際どう使うのがいまいちイメージできず、勉強が続かないということが多かったです。

それよりも、こんなことをしたいけれど、そのためにはどうやってコードを書くかを調べた方が頭に残りやすいのと、その場合検索したほうがピンポイントで見つかるので、最近は参考書は買わなくなってしまいました。

Pythonの勉強についても始めにやりたいことを決めて、方法を調べて自分でプログラミングする方法で勉強していこうと思います。

第1回目の目標は、「画像の読み込みと表示」にしました。

 

ノートブックの新規作成

画像の読み込み命令を記載するため、ノートブックを新規作成をします。

Google Colabで検索をすると「Google Colabratoryへようこそ」というホームページが出てくるのでそこにアクセスします。

f:id:i_knit_you_purl:20220104201752p:plain

ツールバーの「ファイル」→「ノートブックを新規作成」を選択します。

f:id:i_knit_you_purl:20220104201943p:plain

「Untitled0.ipynb」というタイトルの新しいウィンドウが開くので、ファイル名をわかりやすいものに変更します(私は001_read_image.ipynbとしました)。

 

画像のアップロード

読み込みたい画像をはじめにアップロードします。

以下のコードを入力し、左にある実行ボタンを押すとブラウザが開くので表示したい画像を選択します。

from google.colab import files
uploaded_file = files.upload()
uploaded_file_name = next(iter(uploaded_file))

最後の行で、画像名を取得しています。

 

OpenCVについて

今回はOpenCVというライブラリを使います。

opencv.org

OpenCVでは画像の読み込み、画像の作成・保存、画像変換(回転・反転・リサイズなど)、ノイズ処理、物体検出など画像処理や機械学習に関する機能がまとめられています。

とてもたくさんの機能があるので、今日使う画像の読み込みと表示に関連する関数をまとめてみました。

f:id:i_knit_you_purl:20220106195927p:plain

 

画像の読み込みと表示

画像を読み込み、表示するコードは以下の通りです。

import cv2
img=cv2.imread(uploaded_file_name)
cv2.imshow(img)

このコードで行っていることは

1.OpenCVのインポート(導入)

2.imreadで画像を読み込み

3.imshowで画像の表示

 上の表ではimshowの引数にウィンドウ名がありましたが、必要なければ書かなくても問題ありません。

 画像の色はRGBの3つの信号値の組み合わせからできています。

 赤の場合R=255,G=0,B=0となります。

 今回はあまり気にする必要はないですが、OpenCVのimreadで画像を読み込むとBGRの順に信号値を読み込み込むことにご注意ください。

 

実行

緑の矢印ボタンを押せば実行すると、エラーメッセージが出てきます。

f:id:i_knit_you_purl:20220106195336p:plain

メッセージの最後の方にcv2.imshowはJupyterセッションをクラッシュさせるのでClabでは無効になっているそう。google clabのパッチからcv2_imgをインポートすることで解決できるそう。

 

画像の読み込みと表示(修正版)

google colabのパッチからcv2_imshowをインポートして、cv2_imshowを使って画像を表示します。

from google.colab.patches import cv2_imshow
import cv2
img=cv2.imread(uploaded_file_name)
cv2_imshow(img)

注:cv2_imshowの引数のウィンドウ名はありません。cv2.imshowのようにウィンドウ名を入れるとエラーが出てきますのでご注意ください。

 

もう一度実行

修正版を実行すると、アップロードした画像が表示されます。

f:id:i_knit_you_purl:20220106200113p:plain

数年前に鳥取砂丘に行った時の写真。今年は旅行に行けたらいいなぁ。

画像の読み込みと表示は以上です。

 

おまけ

ノートブックの上側に出てきている猫ちゃんが気になった方がいらっしゃるかもしれません。

これは画面右上にある「設定」から出すことができます。

f:id:i_knit_you_purl:20220106200454p:plain

右上の歯車(ギア)ボタンをクリックします

設定画面が出てくるので、「その他」を選択し、猫モードにチェックすると猫ちゃんが出てきます。私は犬が好きという方はコーギーモードをチェックです。

f:id:i_knit_you_purl:20220104205153p:plain

猫モードとコーギーモードがあります

勉強しつつ癒されたい方は試してみてください。

開発環境

画像処理や機械学習などを勉強する時に、プログラミングして、自分で処理を作ることになります。

 

私が使うのはPythonという言語です。

主に2つの理由からこの言語を選んでいます。

Pythonは画像処理や機械学習でよく使われていて情報が多いということと、フレームワーク(よく使う機能をまとめたもの)が豊富で自分で1からコードを書く必要がなく、短期間で開発できるところがPythonを使う大きな理由です。

 

Pythonでコードを書いたり実行するときはGoogle Colaboratory (以下Google Colab)を使います。

Google ColabはGoogleのアカウントがあれば無料※で使うことができます。

※無料版は幾つか制約があります(別の記事で書こうと思います)。

Google Colabは主に2つの良い点があります。

  • 環境設定が簡単
  • パソコンのスペックに依存しない

Pythonを使うための環境設定に初心者はつまづきやすく、挫折してしまう人が多いそうです。Google Colabの場合はそういった設定をすることなくPythonをすぐに使い始めることができます。

また機械学習ではたくさんのデータを処理するため場合、パソコンのスペックが重要になります。

沢山のデータを高速に処理できるGPUが搭載されていると学習を早く進めることができますが、GPUは高価なためすぐにGPUを買おうと決断しづらいところがあります。

Google Colabには性能の良いGPUが備わっていて手持ちのパソコンでGPUを使った学習をすぐに始めることができます。

 

そう言った理由から、まずは勉強してみたいという方にはGoogle Colabがおすすめです。

ある程度勉強が進み、高度な処理をさせるのに制約のある無料版では物足りなくなってくることがあります。

そのような場合は有料版だったり、自分で環境を整える必要が出てきますが、これから勉強を始めたいという方はGoogle Colabから始めてみるのがいいかもしれません。

はじめに

勉強の記録でブログをはじめることにしました。

内容は画像処理と機械学習に関するものです。

最近仕事で必要になってきたのでちゃんと勉強してみようかなと。

 

勉強したことを記録に残すとモチベーションが続くそうなので、やる気の維持と忘備録を兼ねてブログに記録することにしました。

気になったこと、勉強したことなどをちょこちょこ書いていこうと思います。

大学で数学(主に統計)とプログラミング(Java)をちょっと勉強したくらいで、機械学習ははじめてです。学校で勉強したこともかなり忘れてしまっているので、間違って理解していること、説明が足りないところ多々あると思います。

もしお気づきの点がありましたらご教示いただけると幸いです。