序文:
PIL、Pillow、opencv、scikit-imageなど、Pythonベースの画像処理パッケージはまだたくさんあります。その中でも、PILとPillowは機能が限定された最も基本的なデジタル画像処理のみを提供します。opencvは本質的にC ++ライブラリですが、Pythonインターフェースを提供し、公式の更新速度は非常に遅く、インストールは非常に困難です。全体として、scikit-imageはscipyに基づく画像処理パッケージです。完全な機能を備えています。同時に画像をnumpy配列として処理します。データ処理方法、関数名などの点で、MATLABのほとんどすべての画像処理機能を統合します。 Matlabの模倣姿勢は非常に良いです。
さらに重要なのは、Pythonの画像処理パッケージとして、このパッケージは完全にオープンソースで無料であり、Pythonの強力な機能に依存して、主流のディープラーニングやその他の分野でテンソルフローやその他のソフトウェアを操作できることです。したがって、画像処理にscikit-imageを使用することは非常に良い選択です。Matlabは、MATLABが実行できるすべてのことを実行でき、MATLABが実行できないことを実行できます。デジタル画像処理の分野では、MATLABは完全にMatlabを置き換えることができると思います。高価でインターフェイスが美しくないmatlabは、トイレで泣きそうになっています。
もちろん、特定のプログラミング基盤がある場合、このパッケージを学ぶ最良の方法は、公式のドキュメントである公式のscikit-imageドキュメントを読むことです。初心者は、まず人気のあるバージョンの紹介を読むことができます。
1.インストール。
このパッケージは、pipを使用してインストールするとエラーを報告します。オフラインインストールをお勧めします。特定のインストール方法については、以下を参照してください:cv2およびskimage(scikit-image)モジュールをWindowsのpython3にインストールする方法
2、scikit-imageパッケージをインポートする
このパッケージには、さまざまな機能を担当する多くのサブモジュールが含まれています。したがって、インポートすると、さまざまな機能に対してさまざまなモジュールをインポートできます。各モジュールの機能は次のとおりです。
サブモジュール名 | 主な機能 |
---|---|
私 | 画像や動画を読み取り、保存、表示する |
データ | テスト写真とサンプルデータを提供してください |
色 | 色空間変換 |
フィルター | 画像強調、エッジ検出、ソーティングフィルター、自動しきい値など |
ドロー | 線、四角形、円、テキストなどを含む、数の多い配列に対する基本的なグラフィック描画操作 |
変身 | 幾何学的変換またはその他の変換(回転、ストレッチ、ラドン変換など) |
形態学 | 開閉操作、スケルトン抽出などの形態学的操作 |
曝露 | 明るさ調整、ヒストグラム均等化などの画像強度調整 |
特徴 | 特徴の検出と抽出など |
測る | 類似性や輪郭などの画像属性の測定 |
セグメンテーション | 画像のセグメンテーション |
復元 | 画像復元 |
有用 | 一般的な機能 |
以下で個別に説明
from skimage import 函数名
1.画像を読み取って表示します。(使用モジュール:io)
from skimage import io
img=io.imread('图片路径',as_grey = bool值)
io.imshow(img)
このうち、as_grey属性がTrueの場合、カラー画像を読み込んだ後、自動的にグレースケール画像に変換され、そうでない場合は、カラー画像が読み込まれ、デフォルトはFalseになります。
写真を読んだ後、あなたは写真の様々な属性を得ることができます
print(type(img)) #显示类型
print(img.shape) #显示尺寸
print(img.shape[0]) #图片宽度
print(img.shape[1]) #图片高度
print(img.shape[2]) #图片通道数
print(img.size) #显示总像素个数
print(img.max()) #最大像素值
print(img.min()) #最小像素值
print(img.mean()) #像素平均值
2.画像を保存します
matlabの構文は、読み取り時もほとんど同じですが、画像ファイルを書き込むときは、matlab imwrite()
のimsave()
関数を関数に変更するだけです。
from skimage import io,data
img=io.imread('图片路径',as_grey = bool值)#以上的读取图片函数
io.imshow(img)
io.imsave('保存路径',img)
画像を保存するとき、さまざまな形式(jpg、pngなど)で保存することもできます。
バイナリ画像の場合、io.imsave()
関数で直接保存すると黒い画像になります。個人的には保存時に画像の値の範囲が0〜255だとプログラムが考えているためだと思います。データ型の変換が必要です。知っておくと便利ですソリューションはコメント領域で交換できます
3.画像のトリミングとスケーリング。(使用するモジュール:変換)
1)画像サイズのサイズ変更を変更します
同様に、skimage.transform.resize(image, output_shape)
MATLABで画像のサイズを変更する構文と同じ機能が提供されます。
画像:サイズ変更が必要な画像
output_shape:新しい画像サイズ
from skimage import transform,io
import matplotlib.pyplot as plt#用于显示图像
img=io.imread('图片路径',as_grey = bool值)
dst=transform.resize(img, (长, 宽))
plt.figure('resize')
plt.subplot(121)
plt.title('before resize')
plt.imshow(img,plt.cm.gray)
plt.subplot(122)
plt.title('before resize')
plt.imshow(dst,plt.cm.gray)
plt.show()
写真は80×60サイズに変更できます。
4.画像の接続されたドメインのマーキングと選択(使用されるモジュール:測定)
1)接続されたドメインとその属性を取得する
画像の接続されたドメインの取得は、画像処理における比較的高度な関数です。Matlabは、関数を介して画像の接続されたドメインを直接取得できます。skimageパッケージでは、measureサブモジュールの下でlabel()関数を使用して、同じ効果を実現することもできます。
関数形式:
from skimage import measure
labels = measure.label(二值图像,connectivity=None)
- 接続性は接続モードを表し、1は隣接4、2は隣接8を表します。
画像と同じサイズの配列を返します。背景は0で、前景の接続されたドメインは1から上に向かってマークされます。
もちろん、この時点では、人が見えるように接続された領域にマークを付けています。計算された領域、外接長方形、凸包領域など、接続された各領域を個別に操作する場合は、メジャーサブモジュールのregionprops()を呼び出す必要があります。関数。上記のようにメジャーパッケージをインポートすると、関数の形式は次のようになります。 label_att = measure.regionprops(label_image)
このようにして、「label_att」配列から画像内の接続されたドメインの属性を取得できます。属性リストは次のとおりです。
属性名 | の種類 | 解説 |
---|---|---|
範囲 | int | エリア内の総ピクセル数 |
bbox | タプル | 境界ボックス(min_row、min_col、max_row、max_col) |
重心 | アレイ | 重心座標 |
convex_area | int | 凸包のピクセルの総数 |
convex_image | ndarray | バウンディングボックスと同じサイズの凸包 |
コーディネート | ndarray | エリア内のピクセル座標 |
偏心 | 浮く | 偏心 |
同等の直径 | 浮く | 面積と同じ面積の円の直径 |
euler_number | int | 地域オイラー数 |
エクステント | 浮く | バウンディングボックスの面積に対する面積の比率 |
Filled_area | int | 領域とバウンディングボックスの間に塗りつぶされたピクセルの総数 |
境界 | 浮く | エリア周囲 |
ラベル | int | エリアマーカー |
ここで、measure.label関数によって取得された接続されたドメインの背景は0であり、前景の接続されたドメインは実際には1から計算されますが、measure.regionprops関数によって取得された接続されたドメインには背景が含まれず、前景の接続されたドメイン属性は0からです。始めました。
次に例を示し
ます。次のようにして画像を検索します。
次のようにコードを実行します。
from skimage import io,filters,measure
img = io.imread('test.jpg',as_grey=True) #读取图片
thresh = filters.threshold_otsu(img) #用otsu算法确定最佳分割阈值
bwimg =(img>=(thresh)) #用阈值进行分割,生成二值图像
labels = measure.label(bwimg) #标记连通域
label_att = measure.regionprops(labels) #获取各个连通域的属性。
ラベルが5つの接続されたドメインを検出したのに対し、label_attは4つの接続されたドメイン属性しか持っていないことがわかります。これは、バックグラウンドの接続されたドメイン属性が含まれていないためです。
2)小さな領域を削除する
画像には必然的にノイズが含まれます。接続されたドメインが上で処理されると、ノイズは小さな接続されたドメインとしてカウントされます。morphologyサブモジュールのremove_small_objects()関数は、便利なノイズ除去機能を提供します。関数の形式(通常は前の関数と組み合わせて使用されます):
from skimage import morphology
img1 = morphology.remove_small_objects(ar, min_size=要删除的连通域大小阈值, connectivity=1,in_place=False)
img1は、接続されたドメイン領域のしきい値よりも小さいバイナリイメージが削除されます。
その中で、各パラメーターの意味は次のとおりです。
- ar:上記で取得したラベル付き接続ドメインの配列(バイナリイメージのみ)
- 接続:隣接モード、1は4つの隣接、2は8つの隣接を意味します
- in_place:boolタイプ値。Trueの場合、入力画像の小さな領域を直接削除することを意味します。それ以外の場合は、コピー後に削除します。デフォルトはFalseです。
付録:
scikit-imageパッケージは、多くの詳細でもmatlabを模倣します。たとえば、matlabはユーザーがテストするためにいくつかの写真を提供します。外部から写真を読みたくない場合は、これらのサンプル画像を直接使用して機能を実行できますテスト、scikit-imageパッケージには次の機能もあります。
使用方法も非常に簡単です。
from skimage import io,data
img=data.lena()
io.imshow(img)
宇宙飛行士 | 宇宙飛行士の写真 |
---|---|
コーヒー | コーヒーの写真 |
レナ | レナ美容写真 |
カメラ | カメラを持っている人の写真 |
硬貨 | コイン画像 |
月 | 月の写真 |
チェッカーボード | チェス盤絵 |
うま | 馬の写真 |
ページ | ブックページの写真 |
チェルシー | 子猫の写真 |
hubble_deep_field | 星空絵 |
テキスト | テキスト画像 |
時計 | 時計の写真 |
免疫組織化学 | コロン絵 |
イメージ名は関数名に対応しています。これらのサンプルイメージはskimageのインストールディレクトリに保存されており、パス名はdata_dirです。このパスを印刷することもできます:
from skimage import data_dir
print(data_dir)
参考資料:
1. Pythonデジタル画像処理(18):高度な形態処理
2. Python skimage画像処理(1)画像のトリミングに関連するコンテンツがいくつかあります