سؤال

لذلك لدي صورة مثل هذه:

 CG generated bathroom

أريد أن أحصل على شيء كهذا (لم أرسم جميع الخطوط التي أريدها ، لكن آمل أن تتمكن من الحصول على فكرتي):

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

أرغب في استخدام Surf ((ميزات قوية مسبقة) هو واصف صورة قوي ، قدم أولاً بواسطة هربرت باي وآخرون. في عام 2006) أو شيء يعتمد على مبالغ من استجابات المويجات ثنائية الأبعاد HAAR ويستفيد من الصور المتكاملة لإيجاد جميع الخطوط المستقيمة على الصورة. أريد أن أحصل على نقاط خطوط وإنهاء من نقاط السطور.

لذلك على هذه الصورة للعثور على جميع الخطوط بين البلاط وتلك الخطين الأسود في الأعلى.

هل هناك مثال من هذا الكود (مع إمكانية البحث عن الخطوط) للبدء من؟

أنا أحب C و C ++ ولكن أي رمز قابل للقراءة آخر من المحتمل أن يعمل بالنسبة لي =)

هل كانت مفيدة؟

المحلول

فيما يلي مثال كامل على التقديم تحول هوغ للكشف عن الخطوط. أنا أستخدم MATLAB للوظيفة ..

الحيلة هي تقسيم الصورة إلى مناطق ومعالجة كل منها بشكل مختلف ؛ وذلك لأن لديك "قوام" مختلف في المشهد الخاص بك (لا تختلف البلاط في المنطقة العلوية من الجدار تمامًا عن تلك الداكنة في الأسفل ، ولن تكون معالجة الصورة في وقت واحد مثاليًا).

كمثال عمل ، فكر في هذا:

%# 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

يمكنك تجربة نفس الإجراء للمناطق الأخرى أثناء ضبط المعلمات للحصول على نتائج جيدة ..

نصائح أخرى

هل جربت نهجًا أبسط مثل تحويل Hough لإيجاد الخطوط؟ يتم تضمين وظيفة لتنفيذ هذا والمثال في OpenCV تسمى cvhoughlines2.

يتم تنفيذ تحويلات المويجات ثنائية الأبعاد في R باستخدام الحزمة Waveslim. على وجه التحديد ، تستخدم الدالة DWT2D () "الواجهة الخلفية" C للسرعة. يمكنك بعد ذلك تطبيق العتبة للعثور على الخطوط.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top