How to extract ROI on grayscale image using edge detection
9 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Andraz Skoda
le 17 Nov 2016
Commenté : Image Analyst
le 2 Mar 2018
Hello.
I want to extract the white area on the image below (ROI) by using edge detection. I want to do this beacouse I must get very precise mask of white region. The image loks like this:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/158111/image.png)
If I use some of matlab's inbuild function the prolem is that I also get edges outside of the white areas (on the border between black area and gray area).
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/158112/image.png)
I also have to close the whole white area to get mask, after properly detected edges...
Any other suggestions to calculate mask of white area on the first image?
Thank you all!!
0 commentaires
Réponse acceptée
Image Analyst
le 11 Déc 2016
This is very easy, or can be. Just threshold. If you have noise then call imfill() and bwareafilt() to fill and extract the largest blob. Otherwise, simply use find(binaryImage, 1, 'first') to get the x location of the edge. Do for every row and then put into polyfit(x,y,1) to get the equation of a line. Then get the fitted coordinates of a perfect line. then compute the residuals (distances of actual edge to fitted edge). If the residual for any line is more than some certain amount, then there is a defect at that line.
Nowhere in what I said is an edge detection filter required.
Basically something like this:
binaryImage = grayImage > someValue;
binaryImage = imfill(binaryImage, 'holes'); % Optional. Delete for speed
binaryImage = bwareafilt(binaryImage, 1); % Optional, if there is noise in the dark left half.
[rows, columns] = size(binaryImage);
for y = 1 : rows
x(y) = find(binaryImage(y, :), 1, 'first');
end
% Switch x and y so y (line/row) is the independent variable.
y = x;
x = 1 : rows
coefficients = polyfit(x, y, 1); % Fit a line
yFitted = polyval(coefficients, x);
% Scan every line looking for deviation from fitted line
residuals = abs(y - yFitted);
% See if there are any big differences - find out what rows they're on.
defectLines = differences > someThreshold;
and so on. That's just off the otp of my head - not tested - so there may be errors but at least it will give you a start.
4 commentaires
jasmine htwe
le 28 Fév 2018
[rows, columns] = size(binaryImage); for y = 1 : rows x(y) = find(binaryImage(y, :), 1, 'first'); end % Switch x and y so y (line/row) is the independent variable. y = x; x = 1 : rows
When I run this part, I got this error.
Subscripted assignment dimension mismatch.
Error in differences (line 68) x(y)= find(binaryImage(y,:),1,'first');
My image size is (240,270). So, what can I do? plz give me suggestions?
Plus de réponses (3)
Bego
le 17 Nov 2016
Modifié(e) : Bego
le 17 Nov 2016
Hello Andraz!
In order to solve this, you need to separate the black from the grey and from the white. To do so, it is necessary to apply a threshold algorithm which differentiates each one from another ( Thresholding a greyscale image).
At the moment I don't have Matlab with me, but I suggest you have a look at the following documentation about function imbinarize(): https://es.mathworks.com/help/images/ref/imbinarize.html?searchHighlight=threshold#inputarg_method ..specially to the coins example, in which you can see that the medium 'grey' has been supressed from the image.
Additionally, this demo might help you too: https://es.mathworks.com/matlabcentral/fileexchange/29372-thresholding-an-image
Regards,
0 commentaires
Image Analyst
le 17 Nov 2016
You don't want to use edge detection. Why would you want to do that??? Simply threshold and use sum(), bwarea(), or regionprops()
subplot(2,2,1);
imshow(grayImage, []);
subplot(2,2,2);
histogram(grayImage);
binaryImage = grayImage > someThreshold; %
subplot(2,2,3);
imshow(binaryImage);
area1 = sum(binaryImage(:))
area2 = bwarea(binaryImage)
props = regionprops(bwlabel(binaryImage), 'Area');
area3 = [props.Area]
0 commentaires
Andraz Skoda
le 11 Déc 2016
1 commentaire
Qazi Arbab Ahmed
le 21 Déc 2016
Skoda may be you can also use this one, bw = imopen(bw, strel('disk', 5)); It can help you !
Voir également
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!