2016-04-22 5 views
8

によって引き起こされるブロブに拡張子を削除するにはどうすれば私が侵食などのように拡張していますイメージしている:は、形態

enter image description here

:ここ

kernel = np.ones((5,5),np.float32)/1 
     eroded_img = cv2.erode(self.inpainted_adjusted_image, kernel, iterations=10) 
     dilated_img = cv2.dilate(eroded_img, kernel, iterations=10) 

は収縮と膨張の結果です

、その後、私はそうのようにそれのしきい値を取っている:

self.thresh = cv2.threshold(dilated_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1] 

しかし、私は、この不要な地域を取り除くにはどうすればよい

enter image description here

:しきい値は、私が下の画像にマークした不要な拡張子を(赤い線より上の領域が不要な領域である)を与えますか?私がやっていることをする良い方法はありますか?

+0

円形構造要素を使用し、それははるかに遅くなりますが、それはアーティファクトを低減します。 – FiReTiTi

+0

@FiReTiTi、もう少し詳しく教えていただけますか?可能であれば、Pythonの文脈で。 –

+0

私はpythonを使用しないので、利用できる構造化要素がわかりません。しかし、円形のものは、正方形(マンハッタン距離)に反して、距離(真円近辺/距離)を維持する。 – FiReTiTi

答えて

4

バイナリイメージから、ハフ変換を使用して円にフィットするのはかなり簡単です。いったんあなたが円の外側の境界を持っていれば、境界を出血し、境界の外側の部分を切り取ることを示唆します。

もう1つの方法は、しきい値を調整することです。あなたはそれを取り除くことができるように見えます。クリーンなエッジを得るには、いくつかの形態操作が必要な場合があります。ディスクカーネルを使用すると、形状を良好に維持できます。

+0

ハフ・サークルは、必ずしも円形のものではないため、合理的な選択肢ではありません。ディスクカーネルについて少し教えてください。 –

+0

ああ!私はおそらくあなたの質問にそれを含めることができます参照してください。あなたのイメージがあなたの最終的なしきい値イメージのように見えるものの形になっていなくても、明確にするだけですか?ディスクカーネルは、次のようなものです。https://software.intel.com/sites/default/files/managed/f9/47/Figure4.png基本的には円の形をしていますので、腐食すると正方形や長方形のカーネルとは違って曲線のエッジが維持されます。 –

8

異なるタイプのしきい値(ローカルしきい値を考慮する適応しきい値)を使用すると、すでに問題が解消されます。適応しきい値の結果は、探しているものです。

enter image description here

[EDIT:私は、ハフ円にいくつかのコードを追加することの自由を取りました。場合、私は、私たちは知ってみましょう

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

img = cv2.imread('image.png',0) 
thresh = cv2.threshold(img, 210, 255, cv2.ADAPTIVE_THRESH_MEAN_C)[1] 
canny = cv2.Canny(thresh,50,150) 
cimg = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) 

circles = cv2.HoughCircles(canny,cv2.HOUGH_GRADIENT,1,20, param1=50,param2=23,minRadius=0,maxRadius=0) 
circles = np.uint16(np.around(circles)) 


for i in circles[0,:]: 
    # draw the outer circle 
    cv2.circle(cimg,(i[0],i[1]),i[2],(255,0,0),3) 
    # draw the center of the circle 
    cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3) 

titles = ['Original Image', 'Adaptive Thresholding', "Canny", "Hough Circle"] 
images = [img, thresh, canny, cimg] 
for i in xrange(4): 
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') 
    plt.title(titles[i]) 
    plt.xticks([]),plt.yticks([]) 
plt.show() 
]私はあなたが問題のようなタイプのために必要とされている精度のどのタイプか分からないけれども、私は、見栄えの良い結果を得るために、この単一イメージのパラメータを果たしていることを認めますこれではまだ十分ではありません。

+0

この方法の問題点は、しきい値が多少異なるため、しきい値で再生できないことです。 –

+0

完全に理解されていますが、元の画像にアクセスできない場合は、より一般的な解決法を提案することは困難です。 – tfv

+0

私が苦労していた2つの画像:http://imgur.com/a/URBKm –

0

ご質問が元のバージョンにロールバックされているため、画像に適用される洪水塗りを使用したソリューションを添付しました。

import numpy as np 
import cv2 
import sys 
import matplotlib.pyplot as plt 

img = cv2.imread('image.png', 0) 

h, w = img.shape[:2] 
mask = np.zeros((h+2, w+2), np.uint8) 

gray = cv2.blur(img,(5,5)) 
(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(gray) 
print maxLoc 

fixed_range = True 
connectivity = 4 

flooded = img.copy() 
mask[:] = 0 
connectivity = 4 #8 
flags = connectivity 
flags |= cv2.FLOODFILL_FIXED_RANGE 
cv2.floodFill(flooded, mask, maxLoc, (255, 255, 255), (60,)*3, (60,)*3, flags) 

thresh = cv2.threshold(flooded, 250, 255, cv2.THRESH_BINARY)[1] 

titles = ['Original Image', 'Blurred', "Floodfill", "Threshold"] 
images = [img, gray, flooded, thresh] 
for i in xrange(4): 
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') 
    plt.title(titles[i]) 
    plt.xticks([]),plt.yticks([]) 
plt.show() 

enter image description here

関連する問題