10

私の友人の 1 人は、次のプロジェクトに取り組んでいました。

以下は、ステンレス鋼の表面の顕微鏡 (SEM) 画像です。

ここに画像の説明を入力

しかし、ご覧のとおり、(海洋環境に長時間さらされた後)少し腐食し、表面にいくつかの穴が形成されています. ピットのいくつかは赤い丸でマークされています。

彼は画像内のピットの数を見つける必要があり、手動で数えていました (150 近くの画像があると想像してください)。そこで、このプロセスを任意の画像処理ツールで自動化することを考えました。

質問:

この画像のくぼみの数を調べるにはどうすればよいですか?


私が試したこと:

最初のステップとして、クローズ操作でコントラストを少し改善しました。

import numpy as np
import cv2
from matplotlib import pyplot as plt

img = cv2.imread('6.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))

close = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)

close2 = cv2.add(close,1)
div = (np.float32(gray)+1)/(close2)
div2 = cv2.normalize(div,None, 0,255, cv2.NORM_MINMAX)
div3 = np.uint8(div2)

結果:

ここに画像の説明を入力

次に、127 にいくつかのしきい値を適用し、その中の輪郭を見つけました。後で、これらの等高線は、その面積に基づいてフィルター処理されます (面積に関する特定の情報はありません。経験値として 1 ~ 10 の範囲を取りました)。

ret, thresh = cv2.threshold(div3, 127,255, cv2.THRESH_BINARY_INV)
temp, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

res = np.zeros(gray.shape,np.uint8)

for cnt in contours:
    if 1.0 < cv2.contourArea(cnt) < 10.0:
        res = cv2.drawContours(res, [cnt], 0, 255, -1)

plt.subplot(121); plt.imshow(img, 'gray'); plt.subplot(122); plt.imshow(res,'gray'); plt.show() 

しかし、それは多くの余分なノイズに終わりました。以下の結果を参照してください。

ここに画像の説明を入力


追加情報:

いくつかのテスト画像:

ここに画像の説明を入力 ここに画像の説明を入力

4

1 に答える 1