Pergunta

Então, eu tenho uma imagem como esta:

 CG generated bathroom

Quero conseguir algo assim (não desenhei todas as linhas que quero, mas espero que você possa ter minha ideia):

 Black & White CG generated bathroom with some red lines  between tiles

Eu quero usar o surf ((Recursos Robustos Secaturados) é um descritor de imagem robusto, apresentado pela primeira vez por Herbert Bay et al. em 2006) ou algo baseado em somas de respostas de wavelet 2D Haar e faz um uso eficiente de imagens integrais para encontrar todas as linhas retas na imagem. Quero me tornar relativo para a imagem dos coordenados de pixels de pixels.

Portanto, nesta imagem, para encontrar todas as linhas entre os ladrilhos e as 2 linhas pretas por cima.

Existe algum exemplo de código (com capacidade de pesquisa de linhas) para começar?

Eu amo C e C ++, mas qualquer outro código legível provavelmente funcionará para mim =)

Foi útil?

Solução

A seguir é um exemplo completo de aplicação Transformação de Hough para detectar linhas. Estou usando o Matlab para o trabalho ..

O truque é dividir a imagem em regiões e processar de maneira diferente; Isso ocorre porque você tem "texturas" diferentes em sua cena (os azulejos na região superior da parede são bem diferentes dos mais escuros no fundo e o processamento da imagem ao mesmo tempo não será ideal).

Como exemplo de funcionamento, considere este:

%# load image, blur it, then find edges
I0  = rgb2gray( imread('http://www.de-viz.ru/catalog/new2/Holm/hvannaya.jpg') );
I = imcrop(I0, [577 156 220 292]);     %# select a region of interest
I = imfilter(I, fspecial('gaussian', [7 7], 1), 'symmetric');
BW = edge(I, 'canny');

%# Hough Transform and show accumulated matrix
[H T R] = hough(BW, 'RhoResolution',2, 'Theta',-90:0.5:89.5);
imshow(imadjust(mat2gray(H)), [], 'XData',T, 'YData',R, ...
       'InitialMagnification','fit')
xlabel('\theta (degrees)'), ylabel('\rho')
axis on, axis normal, colormap(hot), colorbar, hold on

%# detect peaks
P  = houghpeaks(H, 20, 'threshold',ceil(0.5*max(H(:))));
plot(T(P(:,2)), R(P(:,1)), 'gs', 'LineWidth',2);

%# detect lines and overlay on top of image
lines = houghlines(BW, T, R, P, 'FillGap',50, 'MinLength',5);
figure, imshow(I), hold on
for k = 1:length(lines)
    xy = [lines(k).point1; lines(k).point2];
    plot(xy(:,1), xy(:,2), 'g.-', 'LineWidth',2);
end
hold off

alt text

alt text

alt text

Você pode tentar o mesmo procedimento para outras regiões enquanto sintoniza os parâmetros para obter bons resultados.

Outras dicas

Você já tentou uma abordagem mais simples, como a transformação de Hough para encontrar linhas? Uma função para executar isso e o exemplo estão incluídos no OpenCV chamado cvhoughlines2.

As transformações bidimensionais de wavelet são implementadas em r usando o pacote ondaslim. Especificamente, a função dwt2d () usa um "back -end" C para velocidade. Você pode aplicar o limite para encontrar as linhas.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top