물체 검출과 오검출 평가

Load image

rgb = imread('coloredChips.png'); % MATLAB 기본 제공 이미지
imshow(rgb)
밝은 바탕 위에 빨강·초록·파랑·노랑 등의 원형 칩이 놓인 컬러 샘플 영상. 아직 지름 측정선은 없습니다.

Measure the diameter of a circle

d = drawline; % figure에서 마우스를 drag
원형 칩 샘플에 drawline으로 지름 측정선을 그린 결과. 왼쪽의 노란색 칩을 가로지르는 선과 양 끝점이 보입니다.
pos = d.Position;
diffPos = diff(pos);
diameter = hypot(diffPos(1),diffPos(2))
diameter = 45.8496

Grayscale

gray_image = im2gray(rgb);
imshow(gray_image)

Find circle

[centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity', 'dark')

Control sensitivity

[centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity', 'dark', ...
'sensitivity', 0.9)

Notify the found circles

imshow(rgb)
h = viscircles(centers,radii);

Increase sensitivity

[centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity', 'dark', ...
'sensitivity', 0.92);
length(centers)
delete(h) % Delete previously drawn circles
h = viscircles(centers,radii);

Try another method

[centers,radii] = imfindcircles(rgb,[20 25],'ObjectPolarity', 'dark', ...
'Sensitivity', 0.92, 'Method', 'twostage');
length(centers)
delete(h)
h = viscircles(centers,radii);

For the yellow ones

[centersBright,radiiBright] = imfindcircles(rgb,[20 25], 'ObjectPolarity','bright', ...
'Sensitivity',0.92);
imshow(rgb)
hBright = viscircles(centersBright, radiiBright, 'Color', 'b');

Modify edge threshold

[centersBright,radiiBright] = imfindcircles(rgb,[20 25], 'ObjectPolarity', 'bright', ...
'Sensitivity', 0.92, 'EdgeThreshold', 0.1);
imshow(rgb)
hBright = viscircles(centersBright, radiiBright, 'Color', 'b');

Add the previous ones

h = viscircles(centers,radii);

Merge the circle lists

centers = [centers; centersBright];
radii = [radii; radiiBright];
delete(h)
h = viscircles(centers,radii);