2015-07-27 2 views
0

У меня есть изображение. Я хочу обнаружить четыре отверстия, отмеченные красной линией.Найти круговые круги на картинке

У меня есть все изображения в приведенной ниже ссылке. https://www.dropbox.com/sh/mlrm51qx8s1mcw0/AABu_dLm8RbvPO60H4CJ7I3ka?dl=0

InputImage (Input_Image.bmp)

препроцессированных изображения (PreprocessedImage.bmp)

Работа изображения (отверстия обнаружено) (DetectedHoles.bmp)

нерабочих изображения (только 3 отверстия обнаружено) (NoNWorking.bmp)

Первоначально это предварительная обработка выполняется на входном изображении Входное изображение: Input_Image.bmp

hcontadj=vision.ContrastAdjuster; 
Extracted_Rim_ContrasT_Adj=step(hcontadj,Extracted_Rim); 
J = adapthisteq(Extracted_Rim); 
Sharp_Img=imsharpen(J); 
se=strel('disk',300); 
imtop_op=imtophat(Sharp_Img,se); 


hgamma = ... 
    vision.GammaCorrector(90.0,'Correction','De-gamma'); 
% hgamma = ... 
%  vision.GammaCorrector(12.0,'Correction','Gamma'); 
y = step(hgamma, imtop_op); 

h1 = imfilter(y,fspecial('gaussian',60,5)); 
H2=h1.*6.0; 

se = strel('disk',14); 
% Perform a morphological close operation on the image. 
closeBW = imclose(H2,se); 
figure, imshow(closeBW); 

Выходной сигнал изображение, полученное после вышеуказанной обработки PreprocessedImage.bmp

imfindcircles() и viscircles() используется, чтобы найти [центр, Raddi] и отметьте круги с синим цветом соответственно.

[centers, radii] = imfindcircles(New_Open_Img,[32 100],'Sensitivity',0.81,'ObjectPolarity','dark'); 

    [h,x,y]=viscircles(centers, radii,'EdgeColor','b'); 

Выходной сигнал изображения, полученный после двух вышеупомянутых функций imfindcircles() и viscircles() является DetectedHoles.bmp

, не входящих в рабочее изображение, в котором только три отверстия обнаружены NoNWorking.bmp . В этом случае все четыре круга не будут обнаружены должным образом.

Я настроил чувствительность и радиус в imfindcircles(), но все же я не смог обнаружить все круги.

Было бы признателен, если вы дадите мне некоторое представление о решении этой проблемы.

Благодаря

+0

Какой язык вы используете? Matlab? – Mailerdaimon

+0

Да, я использую MATLAB. – Pankaja

ответ

2

Я предполагаю, что вы используете Matlab, к сожалению, у меня нет здесь установлен Matlab, но я могу дать вам ответ на питона, который должен перевести прямо в Matlab.

Я думаю, что вы идете в хорошем направлении, используя преобразование Hough для кругов (imfindcircles). Но очень важно установить радиус диапазона правильно. Особенно, если вы ожидаете, что образы, которые вы обрабатываете, будут похожими. Если изображения, которые вы загрузили, являются репрезентативными, ваш радиус должен быть между 10 и 15 (может быть, даже слишком щедрым, так как круги, которые вы хотите обнаружить, имеют ширину всего 25 пикселей).

Кроме того, вместо предварительной обработки изображения с помощью морфологических операций, я использовал бы краевой детектор. Я попробовал его с детектором изящного края BW1 = edge(I,'Canny');. Если вы это сделаете, вы также обнаружите круг в середине, вы можете удалить его на этапе последующей обработки. Вам просто нужно проверить, какой круг не находится ни дальше, ни вниз, ни дальше, ни дальше, ни вправо.

Питон/skimage код на основе (немного изменен код примера: http://scikit-image.org/docs/dev/auto_examples/plot_circular_elliptical_hough_transform.html):

import numpy as np 
import matplotlib.pyplot as plt 

from skimage import data, color 
from skimage.transform import hough_circle 
from skimage.feature import peak_local_max, canny 
from skimage.draw import circle_perimeter 
from skimage.util import img_as_ubyte 
from skimage.io import imread 


# Load picture and detect edges 
image = imread('test.jpeg')[..., 0] 
edges = canny(image, sigma=3, low_threshold=10, high_threshold=50) 

fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(20, 10)) 

# Detect two radii 
hough_radii = np.arange(13, 15, 2) 
hough_res = hough_circle(edges, hough_radii) 

centers = [] 
accums = [] 
radii = [] 

for radius, h in zip(hough_radii, hough_res): 
    # For each radius, extract 5 circles 
    num_peaks = 5 
    peaks = peak_local_max(h, num_peaks=num_peaks) 
    centers.extend(peaks) 
    accums.extend(h[peaks[:, 0], peaks[:, 1]]) 
    radii.extend([radius] * num_peaks) 

# Draw the most prominent 5 circles 
image = color.gray2rgb(image) 
for idx in np.argsort(accums)[::-1][:]: 
    center_x, center_y = centers[idx] 
    radius = radii[idx] 
    cx, cy = circle_perimeter(center_y, center_x, radius) 
    image[cy, cx] = (220, 20, 20) 

ax.imshow(image, cmap=plt.cm.gray) 

Notebook (с результатом) здесь: https://gist.github.com/groakat/0e04d10a08fc05bff7e1

В Matlab это должно быть что-то вроде

I = imread('test.jpeg'); 

BW1 = edge(I,'Canny'); 

[centers, radii, metric] = imfindcircles(BW1,[10 15]); 

centersStrong5 = centers(1:5,:); 
radiiStrong5 = radii(1:5); 
metricStrong5 = metric(1:5); 


imshow(I) 
viscircles(centersStrong5, radiiStrong5,'EdgeColor','b'); 
Смежные вопросы