В качестве предисловия: это мой первый вопрос - я изо всех сил старался сделать его максимально ясным, но приношу свои извинения, если он не соответствует требуемым стандартам.Обработка изображений MATLAB - поиск края и области изображения
Как часть летнего проекта, я беру временные изображения внутренней фигуры расплава, растущей внутри кристалла льда. Для каждого из этих изображений я хотел бы измерить периметр и область, заключенную в фигуру. Linked Ниже приведен пример одного из моих изображений:
Метод, который я пытаюсь использовать следующий:
- загрузить изображение, обрезать и конвертировать в оттенках серого
- Процесс снижения шума
- поиск край/периметр
- Попытка соединить края
- Заливка периметр с белым
- Измерение площади и периметра с использованием regionprops
Это код, который я использую:
clear; close all;
% load image and convert to grayscale
tyrgb = imread('TyndallTest.jpg');
ty = rgb2gray(tyrgb);
figure; imshow(ty)
% apply a weiner filter to remove noise.
% N is a measure of the window size for detecting coherent features
N=20;
tywf = wiener2(ty,[N,N]);
tywf = tywf(N:end-N,N:end-N);
% rescale the image adaptively to enhance contrast without enhancing noise
tywfb = adapthisteq(tywf);
% apply a canny edge detection
tyedb = edge(tywfb,'canny');
%join edges
diskEnt1 = strel('disk',8); % radius of 4
tyjoin1 = imclose(tyedb,diskEnt1);
figure; imshow(tyjoin1)
Именно на этом этапе, что я изо всех сил. Края не совсем совпадают, независимо от того, насколько я играю с морфологическим структурирующим элементом. Возможно, есть лучший способ закончить края? Linked пример рисунка этот код выхода:
Причина, по которой я пытаюсь соединить края так, что я могу заполнить периметр с белыми пикселями, а затем использовать regionprops для вывода площадь. Я попытался использовать команду imfill, но, похоже, не может заполнить контур, так как в пределах периметра имеется большое количество темных областей.
Есть ли лучший способ получить область одной из этих фигур расплава, которая является более подходящей в этом случае?
В качестве фонового исследования: я могу заставить этот метод работать для простого изображения, состоящего из черного круга на белом фоне, используя приведенный ниже код. Однако я не знаю, как редактировать его для обработки более сложных изображений с ребрами, которые менее четко определены.
clear all
close all
clc
%% Read in RGB image from directory
RGB1 = imread('1.jpg') ;
%% Convert RPG image to grayscale image
I1 = rgb2gray(RGB1) ;
%% Transform Image
%CROP
IC1 = imcrop(I1,[74 43 278 285]);
%BINARY IMAGE
BW1 = im2bw(IC1); %Convert to binary image so the boundary can be traced
%FIND PERIMETER
BWP1 = bwperim(BW1);
%Traces perimeters of objects & colours them white (1).
%Sets all other pixels to black (0)
%Doing the same job as an edge detection algorithm?
%FILL PERIMETER WITH WHITE IN ORDER TO MEASURE AREA AND PERIMETER
BWF1 = imfill(BWP1); %This opens figure and allows you to select the areas to fill with white.
%MEASURE PERIMETER
D1 = regionprops(BWF1, 'area', 'perimeter');
%Returns an array containing the properties area and perimeter.
%D1(1) returns the perimeter of the box and an area value identical to that
%perimeter? The box must be bounded by a perimeter.
%D1(2) returns the perimeter and area of the section filled in BWF1
%% Display Area and Perimeter data
D1(2)
Upvoted потому, что вы сделали отличную работу задавая вопрос. – guyrt