PythonとOpenCVを使って画像分割|二値化やグレースケールの変換等を解説

スポンサーリンク

こんにちは、コーダー仲間です。この記事では、画像分割とは何かを理解し、後のセクションでは、Pythonプログラミング言語のOpenCVを使って同じことを実装します。

スポンサーリンク

イメージセグメンテーションとは

画像セグメンテーションとは、画像中のオブジェクトを簡単に分類・分類するために、画像中の類似したピクセルや部分をグループ化することを意味します。

なぜ画像分割が必要なのか?

画像セグメンテーションは、画像処理システムにおいて重要な段階であり、興味のあるオブジェクトを抽出し、将来のモデリングを容易にします。また、不要なオブジェクトから必要なオブジェクトを分離することができます

画像分割の応用

画像セグメンテーションは、実生活において様々な応用が可能です。その一部を紹介します。

  1. 交通管理システム
  2. 癌やその他の医療問題の検出
  3. 衛星画像解析

画像分割の実装

1. モジュールのインポート

Image Segmentationの実装とImage plotingに必要なモジュールは全てインポートされています。

1
2
3
import numpy as np
import cv2
from matplotlib import pyplot as plt

2. 元画像の読み込み

次に、以下のコードを使って、オリジナル画像(コードファイルと同じディレクトリに保存されています)を読み込みます。また、出力はコードのすぐ下に表示されます。

1
2
3
4
5
6
7
img = cv2.imread('image1.jpg')
img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.figure(figsize=(8,8))
plt.imshow(img,cmap="gray")
plt.axis('off')
plt.title("Original Image")
plt.show()
1
2
3
4
5
6
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt.figure(figsize=(8,8))
plt.imshow(gray,cmap="gray")
plt.axis('off')
plt.title("GrayScale Image")
plt.show()

3. グレースケールへの変換

今後の画像処理をより簡単にするために、前項で読み込んだ画像を以下のコードでグレースケール画像に変換します。出力された画像は、コードの下に表示されています。

1
2
3
4
5
6
ret, thresh = cv2.threshold(gray, 0, 255,cv2.THRESH_BINARY_INV +cv2.THRESH_OTSU)
plt.figure(figsize=(8,8))
plt.imshow(thresh,cmap="gray")
plt.axis('off')
plt.title("Threshold Image")
plt.show()
1
2
3
4
5
6
7
8
9
10
11
kernel = np.ones((3, 3), np.uint8)
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE,kernel, iterations = 15)
bg = cv2.dilate(closing, kernel, iterations = 1)
dist_transform = cv2.distanceTransform(closing, cv2.DIST_L2, 0)
ret, fg = cv2.threshold(dist_transform, 0.02*dist_transform.max(), 255, 0)
cv2.imshow('image', fg)
plt.figure(figsize=(8,8))
plt.imshow(fg,cmap="gray")
plt.axis('off')
plt.title("Segmented Image")
plt.show()

4. 2値化された画像への変換

画像をより詳細に研究し、非常に精密な研究を行うために、以下のコードを使用して画像を2値反転画像に変換します。出力はコードと一緒に表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
plt.figure(figsize=(10,10))
 
plt.subplot(2,2,1)
plt.axis('off')
plt.title("Original Image")
plt.imshow(img,cmap="gray")
 
plt.subplot(2,2,2)
plt.imshow(gray,cmap="gray")
plt.axis('off')
plt.title("GrayScale Image")
 
plt.subplot(2,2,3)
plt.imshow(thresh,cmap="gray")
plt.axis('off')
plt.title("Threshold Image")
 
plt.subplot(2,2,4)
plt.imshow(fg,cmap="gray")
plt.axis('off')
plt.title("Segmented Image")
 
plt.show()
Original Image Segmentation
Original Img Segmentation

5. 画像のセグメンテーション

さて、最後のステップは、後述のコードを用いてセグメント化された画像を取得することです。これまでの画像を全て利用し、最も正確なセグメンテーション画像を取得することを目指します。

Grayscale Image Segmentation
Grayscale Img Segmentation
Threshold Img Segmentation
Threshold Img Segmentation

最終的な出力

すべての処理が完了し、画像がセグメント化されたら、サブプロットを使って、すべての結果を1つのフレームにプロットしてみましょう。そのためのコードは以下の通りです。

Segmented Img Segmentation
Segmented Img Segmentation

最終的な結果は以下のようになります。

Segmentation Output1
Segmentation Output1

同じアルゴリズムを別の画像でテストしたところ、以下のような結果が得られました。かなり満足のいく結果であることがわかると思います。

Segmentation Output2
Segmentation Output2

まとめ

今日は画像のセグメンテーションについて学びましたが、これと同じことを自分で実装する方法がわかりましたね。いろいろな画像に対して、自分で試してみてください。それでは、ハッピーコーディング!

お読みいただきありがとうございました。

タイトルとURLをコピーしました