-
Notifications
You must be signed in to change notification settings - Fork 1
/
recognition.m
85 lines (77 loc) · 3.32 KB
/
recognition.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
% Analizza l'immagine e cerca eventuali difetti
%
% INPUT
% imageIndex: nome dell'immagine senza estensione
%
% OUTPUT
% image: l'immagine iniziale
% finalImage: l'immagine iniziale con i difetti evidenziati
% mask: la maschera prima dell'operazione di strel
% finalMask: la mascherza finale, dopo l'operazione di strel
function [image, finalImage, mask, finalMask] = recognition(imageIndex)
[image, yImageSize, xImageSize] = loadImage(strcat(int2str(imageIndex), '.jpg'));
% Costanti
startPatternX = 1;
startPatternY = 1;
patternWidth = 9.5;
patternStartWidth = 125;
threshold = 90;
maskValue = 0.07;
diskSize = 5;
cumulativeNumber = 0.01;
% Viene chiamata la funzionce che restituisce i 4 pattern migliori che
% vengono ricavati da un pattern standard di partenza
[pattern1, pattern2, pattern3, pattern4, patternWidth] = getPatterns(image, startPatternX, startPatternY, patternWidth, threshold, patternStartWidth);
% Viene calcolata la cross-correlazione normalizzata utilizzando i quattro
% pattern restituiti dalla funzione precedente
normxcorrImage1 = normxcorr2(pattern1, image);
normxcorrImage2 = normxcorr2(pattern2, image);
normxcorrImage3 = normxcorr2(pattern3, image);
normxcorrImage4 = normxcorr2(pattern4, image);
normxcorrImage = (normxcorrImage1 + normxcorrImage2 + normxcorrImage3 + normxcorrImage4) / 4;
[xcorrY, xcorrX] = size(normxcorrImage);
normxcorrImage = normxcorrImage(patternWidth : end - patternWidth, patternWidth : end - patternWidth);
normxcorrAbsoluteImage = abs(normxcorrImage);
% Viene determinata la maschera iniziale
mask = normxcorrAbsoluteImage < maskValue;
% Viene calcolato il numero di pixel che sono identificati come errore e
% la maschera iniziale viene adeguata in relazione ad essi in modo da
% ridurre i falsi positivi
errorDots = find(mask == 1);
nOfErrorDots = size(errorDots);
if(nOfErrorDots(1) < (xImageSize * yImageSize * 0.5))
while(nOfErrorDots(1) < (xImageSize * yImageSize * 0.5))
maskValue = maskValue + cumulativeNumber;
mask = normxcorrAbsoluteImage < maskValue;
errorDots = find(mask == 1);
nOfErrorDots = size(errorDots);
end
else
while(nOfErrorDots(1) > (xImageSize * yImageSize *0.5))
maskValue = maskValue - cumulativeNumber;
mask = normxcorrAbsoluteImage < maskValue;
errorDots = find(mask == 1);
nOfErrorDots = size(errorDots);
end
end
se = strel('disk', diskSize);
finalMask = imopen(mask, se);
% Viene variata la dimensione dello strel in base al numero di pixel
% errati presenti nell'immagine
errorDots = find(finalMask == 1);
nOfErrorDots = size(errorDots);
errorRate = 0.00076;
while(nOfErrorDots(1) <= (yImageSize * xImageSize * errorRate))
diskSize = diskSize - 1;
se = strel('disk', diskSize);
finalMask = imopen(mask, se);
errorDots = find(finalMask == 1);
nOfErrorDots = size(errorDots);
end
diffr = xcorrY - yImageSize;
diffc = xcorrX - xImageSize;
image = image(floor(diffr / 2) : end - round(diffr / 2), floor(diffc / 2) : end - round(diffc / 2));
nextImage = image;
nextImage(finalMask) = 255;
finalImage = cat(3, nextImage, image, image);
end