MATLAB: сглаживание кривых на наклонных краях — обнаружение краев (Polyfit или fitPolynomialRANSAC?)

#matlab #image-processing #edge-detection

#matlab #обработка изображений #обнаружение краев

Вопрос:

у меня есть изображения с полосами. Полосы не всегда на 100% прямые и не всегда на 100% горизонтальные. Они могут быть наклонены и согнуты. Каждая полоса имеет постоянную ширину. Мне нужна ширина каждой полосы на изображении и показать края каждой полосы как можно более гладкими: Example_edge_detection.png Example_straight.png Example_tilted.png

У меня уже есть решение для 100% прямых горизонтальных полос. Но я не знаю, как это сделать с наклонными полосами. Может быть, нужны Polyfit или houghlines? Пожалуйста, помогите мне. Спасибо!

Вот рабочий код для прямых горизонтальных полос!

 clc;    
close all;  
clear;  
workspace;  
format long g;
format compact;
fontSize = 20;

folder = pwd;
baseFileName = 'Example_straight.png';
grayImage = imread(baseFileName);
[rows, columns, numberOfColorChannels] = size(grayImage);

if numberOfColorChannels > 1
    grayImage = min(grayImage, [], 3);
end

hFig = gcf;
hFig.WindowState = 'maximized';
grayImage = adapthisteq(grayImage);
verticalProfile = mean(grayImage, 2);
threshold = 118;

binaryImage = imfill(grayImage < threshold, 'holes');
% Take the 3 largest blobs
binaryImage = bwareafilt(binaryImage, 3);
% Snip off small tendrils using imopen()
binaryImage = imopen(binaryImage, true(1, 3));
% Take the 3 largest blobs
binaryImage = bwareafilt(binaryImage, 3);
subplot(1, 1, 1);
imshow(baseFileName);
hFig = gcf;
hFig.WindowState = 'maximized'; % 
axis('on', 'image');
title('Edge Detection', 'FontSize', fontSize, 'Interpreter', 'None');

binaryProfile = (verticalProfile > threshold)';
bandStarts  = strfind(binaryProfile, [0, 1]);
bandStops = strfind(binaryProfile, [1, 0]);
for k = 1 : length(bandStarts)
    yline(bandStarts(k), 'Color', 'r', 'LineWidth', 1);
    yline(bandStops(k), 'Color', 'r', 'LineWidth', 1);
end
 

Ответ №1:

Похоже, что ваш алгоритм в настоящее время просто выполняет простой порог для поиска горизонтальных линий, где порог применяется к разнице в среднем значении горизонтального пикселя между двумя соседними строками. Если этого достаточно для выполнения работы, для меня этого достаточно.

Что касается негоризонтальных линий, может быть, вы можете попробовать такую процедуру, чтобы сначала просто выровнять изображение.

Комментарии:

1. Мм, вращение не работает, есть перебор: (