تبدیل هاف (: Hough transform)
روشی برای استخراج ویژگیها در آنالیز تصاویر، بینایی رایانهای و پردازش تصویر دیجیتال است.
این روش در یک تصویر به دنبال نمونههایی از یک الگو میگردد.
این نمونهها ممکن است کامل نباشند و همچنین تا حدی دچار اعوجاج شده باشند.
به عنوان نمونه از کاربردهای این روش میتوان به تشخیص وجود خط مستقیم در یک تصویر اشاره کرد.
***در این برنامه تصویر دایره ها با استفاده از تبدیل هاف پیدا میشود
نحوی اجرای برنامه :
ابتدا تصویر را خوانده در متغیر im ذخیره می کنیم.
minR, maxR را هم اندازه هم انتخاب می کنیم. که این مقایر ماکزیمم و مینیم شعاع دایره ها را مشخص می کند
thresh نسبت حداقل تعداد لبه شناسایی
***, thresh, delta این مقادیر را اگر در ابتدا برنامه مشخص نکنیم به صورت پیش فرض در برنامه مقداردهی می شوند.
im=imread(‘F:\circle.jpg’);
خواندن تصویر مورد نظر
houghcircles(im,10,10,0.24)
اجرای تابع اصلی پروژه که دایره ها شناسایی می کند.
کد متلب با تابع houghcircles معرفی می شود :
function circles = houghcircles(im, minR, maxR, thresh)
%
% HOUGHCIRCLES detects multiple disks (coins) in an image using Hough
% Transform. The image contains separating, touching, or overlapping
% disks whose centers may be in or out of the image.
%% Syntax
% houghcircles(im, minR, maxR);
% houghcircles(im, minR, maxR, thresh);
% houghcircles(im, minR, maxR, thresh, delta);
% circles = houghcircles(im, minR, maxR);
% circles = houghcircles(im, minR, maxR, thresh);
% circles = houghcircles(im, minR, maxR, thresh, delta);
%% Inputs:
% – im: input image
% – minR: minimal radius in pixels
% – maxR: maximal radius in pixels
% – thresh (optional): the minimal ratio of the number of detected edge
% pixels to 0.9 times the calculated circle perimeter (0
im = rgb2gray(im);
end
% Create a 3D Hough array with the first two dimensions specifying the
% coordinates of the circle centers, and the third specifying the radii.
% To accomodate the circles whose centers are out of the image, the first
% two dimensions are extended by 2*maxR.
٪ ایجاد یک آرایه هاف 3D با دو بعد مشخص اول
٪ مختصات مرکز دایره، و سوم تعیین شعاع.
٪ به جای دایره هایی که مراکز خارج از تصویر
٪ دو بعد توسط 2 * maxR
maxR2 = 2*maxR;
hough = zeros(size(im,1)+maxR2, size(im,2)+maxR2, maxR-minR+1);
% For an edge pixel (ex ey), the locations of its corresponding, possible
برای پیکسل لبه (ex ey) مکان متناظر با آن، ممکن است استفاده بشود
% circle centers are within the region [ex-maxR:ex+maxR, ey-maxR:ey+maxR].
% Thus the grid [0:maxR2, 0:maxR2] is first created, and then the distances
% between the center and all the grid points are computed to form a radius
درصد بین مرکز و تمام نقاط شبکه به شکل یک شعاع محاسبه می شود
% map (Rmap), followed by clearing out-of-range radii.
[X Y] = meshgrid(0:maxR2, 0:maxR2);
Rmap = round(sqrt((X-maxR).^2 + (Y-maxR).^2));
Rmap(Rmap
% Detect edge pixels using Canny edge detector. Adjust the lower and/or
توسط آشکارساز لبه کنی پیکسل های لبه شناسایی می شوند
% upper thresholds to balance between the performance and detection quality.
% For each edge pixel, increment the corresponding elements in the Hough
% array. (Ex Ey) are the coordinates of edge pixels and (Cy Cx R) are the
% centers and radii of the corresponding circles.
edgeim = edge(im, ‘canny’, [0.15 0.2]);
[Ey Ex] = find(edgeim);
[Cy Cx R] = find(Rmap);
for i = 1:length(Ex);
Index = sub2ind(size(hough), Cy+Ey(i)-1, Cx+Ex(i)-1, R-minR+1);
hough(Index) = hough(Index)+1;
end
% Collect candidate circles.
% Due to digitization, the number of detectable edge pixels are about 90%
با توجه به دیجیتالی کردن، تعداد پیکسل لبه قابل تشخیص هستند حدود 90٪
% of the calculated perimeter.
twoPi = 0.9*2*pi;
circles = zeros(0,4); % Format: (x y r t)
for radius = minR:maxR % Loop from minimal to maximal radius
یک حلقه از حداقل و حداکثر شعاع
slice = hough(:,:,radius-minR+1); % Offset by minR
twoPiR = twoPi*radius;
slice(slice