How to extract ROI on grayscale image using edge detection
26 views (last 30 days)
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:
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).
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!!
Image Analyst on 11 Dec 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');
% 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.
More Answers (3)
Bego on 17 Nov 2016
Edited: Bego on 17 Nov 2016
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
Image Analyst on 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()
binaryImage = grayImage > someThreshold; %
area1 = sum(binaryImage(:))
area2 = bwarea(binaryImage)
props = regionprops(bwlabel(binaryImage), 'Area');
area3 = [props.Area]