fitting a curve on a binary image and interpolating to produce a continuous graph

조회 수: 5 (최근 30일)
This is first time I have ever used mathworks, so your help is greatly appreciated. I took a m-mode ultrasound image and imputed it into imagej in which I removed the noise and binarized the image. This resulted in a graph like image, but it is not as smooth as I want. I want to able to curve fit it and potentially use interpollation to give a filled in graph. linked below is my binarized image.
  댓글 수: 4
Matt J
Matt J 2022년 10월 14일
Is the curve supposed to follow any particular model? Is it a pure sinusoid?

댓글을 달려면 로그인하십시오.

채택된 답변

Image Analyst
Image Analyst 2022년 10월 15일
Try this:
% Demo by Image Analyst
clc; % Clear the command window.
close all; % Close all figures (except those of imtool.)
clear; % Erase all existing variables. Or clearvars if you want.
workspace; % Make sure the workspace panel is showing.
format long g;
format compact;
fontSize = 22;
markerSize = 40;
%--------------------------------------------------------------------------------------------------------
% READ IN IMAGE
folder = [];
baseFileName = 'sinusoid ultrasound.jpeg';
fullFileName = fullfile(folder, baseFileName);
% Check if file exists.
if ~exist(fullFileName, 'file')
% The file doesn't exist -- didn't find it there in that folder.
% Check the entire search path (other folders) for the file by stripping off the folder.
fullFileNameOnSearchPath = baseFileName; % No path this time.
if ~exist(fullFileNameOnSearchPath, 'file')
% Still didn't find it. Alert user.
errorMessage = sprintf('Error: %s does not exist in the search path folders.', fullFileName);
uiwait(warndlg(errorMessage));
return;
end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(grayImage)
%--------------------------------------------------------------------------------------------------------
% Display the image.
subplot(2, 2, 1);
imshow(grayImage);
impixelinfo;
axis('on', 'image');
title('Original Image', 'FontSize', fontSize, 'Interpreter', 'None');
if numberOfColorChannels > 1
% It's not really gray scale like we expected - it's color.
fprintf('It is not really gray scale like we expected - it is color\n');
% Extract the blue channel.
grayImage = grayImage(:, :, 3);
end
% Update the dimensions of the image.
% numberOfColorChannels should be = 1 for a gray scale image, and 3 for an RGB color image.
[rows, columns, numberOfColorChannels] = size(grayImage)
% Maximize window.
g = gcf;
g.WindowState = 'maximized';
drawnow;
%--------------------------------------------------------------------------------------------------------
% Display the histogram.
subplot(2, 2, 2);
histogram(grayImage(grayImage>0), 256);
grid on;
title('Histogram of Image Gray Levels', 'FontSize', fontSize, 'Interpreter', 'None');
% Threshold the image to get the dark stuff.
% https://www.mathworks.com/matlabcentral/fileexchange/29372-thresholding-an-image?s_tid=srchtitle
lowThreshold = 64;
highThreshold = 255;
% [lowThreshold, highThreshold, lastThresholdedBand] = threshold(lowThreshold, highThreshold, grayImage)
mask = grayImage >= lowThreshold & grayImage <= highThreshold;
% Take 5 largest blobs
mask = bwareafilt(mask, [10, inf]);
% Fill in the bubble so that it will have only 3 sides.
mask = imfill(mask, 'holes');
subplot(2, 2, 3);
imshow(mask)
title('Mask Image', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
impixelinfo
% Sum the first 30 rows
horizontalProfile = sum(grayImage(1:30, :));
% Display summed lines.
subplot(2, 2, 4);
hold on;
plot(horizontalProfile, 'b-', 'LineWidth',2);
grid on;
title('Horizontal Profile with Peaks Shown', 'FontSize', fontSize, 'Interpreter', 'None');
% Threshold at 3000 to find peaks
horizontalProfile(horizontalProfile<3000) = 0; % Suppress small peaks
[peakValues, indexesOfPeaks] = findpeaks(horizontalProfile)
hold on
plot(indexesOfPeaks, peakValues, 'rv', 'LineWidth', 2);
% Find the average peak to peak wavelength
meanPeriod = mean(diff(indexesOfPeaks))
% Show sine wave over image
hfig = figure;
imshow(grayImage, []);
title('Image With Sine Wave', 'FontSize', fontSize, 'Interpreter', 'None');
axis('on', 'image');
impixelinfo
hold on
amplitude = rows/2;
x = 1 : columns;
phasex = mean([x(indexesOfPeaks(1)), x(indexesOfPeaks(2))])
y = amplitude * sin(2 * pi * (x - phasex/2) / meanPeriod) + rows/2;
plot(x, y, 'r-', 'LineWidth', 3);
hfig.WindowState = 'maximized'

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Image Processing Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by