Từ Bảng 1, ta thấy sai sỗ mẫu ở hình cad_03 là do ảnh vẽ từ CAD khi in ra bị mờ ở một số vùng trên ảnh nhƣ Hình 4.6. Những vùng này qua bộ phân ngƣỡng sẽ bị mất đi dẫn đến kết quả đo đạc độ rộng ở những điểm này sẽ có
48
sai số lớn. Đây cũng chính là điểm yếu của giải thuật hiện tại, kết quả đo rất nhạy với nhiễu đặc biệt là đối với các đối tƣợng có kích thƣớc nhỏ nhƣ chiều rộng. Điều này thể hiện ở sai số đo đạc chiều rộng trên tập mẫu chụp thực tế thƣờng lớn hơn so với chiều dài.
49
CHƢƠNG 5. KẾT LUẬN KIẾN NGHỊ
5.1 Kết luận
Trong luận văn này, học viên đã đƣa ra đƣợc một giải pháp để có thể đo đạc chiều dài, chiều rộng và phân loại các vết nứt xuất hiện trên bề mặt bê tông từ một ảnh chụp hai chiều của vết nứt. Giải pháp này cho phép ngƣời kỹ sƣ có thể tiến hành đo đạc nhanh chóng, chính xác và giảm chi phí lắp đặt dàn giáo khi phải đo đạc các vết nứt nằm ở các vị trí khó tiếp cận.
Ƣu điểm của luận văn là sử dụng một vật tham chiếu có màu sắc và kích thƣớc xác định trƣớc. Sau đó bằng việc áp dụng các giải thuật phân tách đối tƣợng dựa trên màu sắc, ta có thể xác định đƣợc hệ số quy đổi giữa pixel/cm. Điều này cho phép việc đo đạc đƣợc tiếp hành tự do hơn. Bên cạnh đó, khi áp dụng thuật toán Otsu để xác định ngƣỡng nhị phân để phân biệt vết nứt cũng giảm đƣợc việc phải cấu hình các thơng số cho q trình đo đạc.
5.2 Kiến nghị và hƣớng phát triển của đề tài
Mặc dù giải thuật đã đƣợc thử nghiệm và đạt đƣợc các kết quả tƣơng đối khả quan khi đo đạc trên thực tế. Tuy nhiên nó vẫn tồn tại một số điểm yếu nhƣ: khả năng phân tách vùng nứt chịu tác động lớn bởi nhiễu, và độ tƣơng phản màu của vết nứt đối với các vùng xung quanh làm gia tăng sai số đo. Yêu cầu phải dán điểm tham chiếu lên bề mặt vết nứt cần đo cũng phần nào gây khó khăn cho q trình đo đạc.
Do đó hƣớng phát triển tiếp theo của đề tài là nghiên cứu giải thuật tối ƣu hơn để phân tách vết nứt ra khỏi vùng nền điều này giúp cải thiện sai số đo đạc. Bên cạnh đó để có thể ứng dụng giải thuật trên thực tế, ta cũng cần nghiên cứu xây dựng thiết bị đo tích hợp đƣợc hai thành phần: Camera và thiết bị đo khoảng cách. Khi đó ta có thể đo khoảng cách từ camera đến đối tƣợng ngay tại thời điểm chụp, từ đó có thể tính ra đƣợc tỉ lệ quy đổi pixel/cm mà không phải sử dụng vật tham chiếu dán trên bề mặt vết nứt.
50
TÀI LIỆU THAM KHẢO
[1] Sattar Dorafshan,Marc Maguire,Xiaojun Q, "Automatic Surface Crack Detection in Concrete Structures Using OTSU Thresholding and Morphological Operations," CEE Faculty Publications, no. Civil and Environmental Engineering, p. 1234, 2016.
[2] A. M. A. Z. H. X. F. a. H. L. Talab, "Detection crack in image using Otsu method and multiple filtering inimage processing techniques," Optik, pp. 1-4, 2015.
[3] LAN LI, PAUL CHAN, AND ROBERT L. LYTTON , "Detection of thin cracks on noisy pavement images," TRANSPORTATION RESEARCH RECORD 1311 , pp. 131-135, 1991.
[4] J Kittler, R Marik, M Mirmehdi, M Petrou, J Song , "DETECTION OF DEFECTS IN COLOUR TEXTURE SURFACES," IAPR Workshop on Machine Vision Application, pp. 558-567, 1994.
[5] H. D. Cheng; Jim-Rong Chen; Chris Glazier; and Y. G. Hu, "Novel approach to pavement cracking detection based on fuzzy set theory,"
Journal of Computing in Civil Engineering, vol. 13, no. 4, 1999.
[6] Ikhlas Abdel-Qader, P.E.; Osama Abudayyeh, P.E., M.ASCE; and Michael E. Kelly, "Analysis of Edge-Detection Techniques for Crack Identification in Bridges," Journal of Computing in Civil Engineering,
vol. 17, no. 4, 2003.
[7] Yaxiong Huang; Bugao Xu, "Automatic inspection of pavement cracking distress," Journal of Electronic Imaging, 2006.
51
detection and analysis for high-grade highway," Electronic Measurement and Instruments, 2007. ICEMI '07. 8th International Conference on. IEEE,2007, 2007.
[9] Qingquan Li ; Xianglong Liu, "Novel approach to pavement image segmentation based on neighboring difference histogram method," Image
and Signal Processing, 2008. CISP '08. Congress on, vol. 2, 2008.
[10] Yongxia Zuo ; Guoqiang Wang ; Chuncheng Zuo, "A Novel Image Segmentation Method of Pavement Surface Cracks Based on Fractal Theory," Computational Intelligence and Security, 2008. CIS '08. International Conference on, 2008.
[11] Hyeong-Gyeong Moon, Jung-Hoon Kim, "Intelligent crack detecting algorithm on the concrete crack image using neural network,"
Proceedings of the 28th ISARC, pp. 1461-1467, 2011.
[12] Takafumi Nishikawa, Junji Yoshida, Toshiyuki Sugiyama, Yozo Fujino, "Concrete Crack Detection by Multiple Sequential Image Filtering,"
Computer-aided civil and infrastructure engineering, vol. 27, no. 1, pp. 29-47, 2017.
[13] R.S.Adhikari, O.Moselhi, A.Bagchi, "Image-based retrieval of concrete crack properties for bridge inspection," Automation in Construction, vol.
39, pp. 180-194, 2014.
[14] Bang Yeon Lee , Yun Yong Kim , Seong-Tae Yi, Jin-Keun Kim, "Automated image processing technique for detecting and analysing concrete surface cracks," Structure and Infrastructure Engineering , vol. 9, no. 6, pp. 567-577, 2013.
52
Concrete Structure," IACSIT International Journal of Engineering and Technology, vol. 5, pp. 457-461, 2013.
[16] Jong-Woo Kim, Sung-Bae Kim, Jeong-Cheon Park and Jin-Won Nam, "Development of Crack Detection System with Unmanned Aerial Vehicles and Digital Image Processing," Advances in structural engineering and mechanics, 2015.
[17] Romulo Gonỗalves Lins ; Sidney N. Givigi, "Automatic crack detection and measurement based on image analysis," IEEE Transactions on Instrumentation and Measurement, vol. 65, no. 3, pp. 583 - 590, 2016.
[18] Bandyopadhyay, Samir Kumar, "Crack Detection and Classification in Concrete Structure," Journal for Research, vol. 2.04, 2016.
[19] Yohwan Noh ; Donghyun Koo ; Yong-Min Kang ; DongGyu Park ; DoHoon Lee, "Automatic crack detection on concrete images using segmentation via fuzzy C-means clustering," Applied System Innovation (ICASI), 2017 International Conference on, 2017.
[20] Lê Anh Thắng, Nguyễn Hải Dƣơng, "Xác định kích thƣớc vết nứt trên mặt đƣờng bê tông nhựa từ ảnh 2D," Tạp chí của Bộ Xây dựng số 8 năm 2015..
[21] Lê Anh Thắng, Nguyễn Duy Liên, Nguyễn Hải Dƣơng, "Phân loại hƣ hỏng nứt trên mặt đƣờng bê tông nhựa bằng thực toán SVM” Hội thảo quốc gia Hạ tầng giao thông với phát triển bền vững lần thứ 2.," Nhà xuất
bản xây dựng ISBN G7 & 604-82-1 BN-6. Năm 2016..
[22] N. Otsu, "A threshold selection method from gray-level histograms,"
IEEE Transactions on Systems, Man, and Cybernetics, vol. 9, no. 1, pp. 62-66, 1979.
53
[23] N. S. Altman, "An introduction to kernel and nearest-neighbor nonparametric regression," The American Statistician, vol. 46, p. 175– 185, 1992.
[24] N. P. A. Tuan, Báo cáo nghiên cứu khoa học đề tài nhận dạng biển số xe, Bien Hoa: Khoa Điện-Điện Tử, ĐH Lạc Hồng, 2010.
[25] F. o. k. a. c. d. silva, Soft Computing and Intelligent Systems Design theory, tools and applications.
54
PHỤ LỤC I: CHƢƠNG TRÌNH MƠ PHỎNG
Chƣơng trình mơ phỏng đƣợc xây dựng trên Matlab với giao diện chƣơng trình nhƣ ở hình bên dƣới:
Giao diện chƣơng trình gồm 4 phần:
Bảng điều khiển: chứa các nút điều khiển quá trình xử lý ảnh bao gồm:
“Nhập ảnh”: nhập ảnh vết nứt cần đo đạc, phân loại.
“Phân loại”: thực hiện phân loại ảnh vết nứt.
“Đo đạc”: thực hiện đo dạc các thông số chiều rộng/chiều dài của ảnh.
Cấu hình: Phần cấu hình các thơng số cho ảnh.
“Tự động hiệu chỉnh”: có hai chế độ lựa chọn để xác định tỉ lệ tƣơng quan. (Scale) giữa kích thƣớc một pixel so với kích thƣớc đo chiều dài (cm).
Nếu lựa chọn tự động hiệu chỉnh, phần mềm sẽ tự động tính tốn tỉ lệ Scale dựa trên điểm đỏ trên ảnh, và giá trị này sẽ đƣợc hiển thị ở vùng Scale.
Nếu lựa chọn hiệu chỉnh bằng tay (bỏ dấu tick) thì ngƣời dùng phải nhập giá trị tƣơng quan Pixel/cm vào ô Scale.
55
“D_diem_chuan”: đƣờng kính của điểm chuẩn, dùng với lựa chọn “tự động hiệu chỉnh”. Trong tập ảnh mẫu, các điểm chuẩn đều có kích thƣớc là 0.68cm.
“Vùng hiển thị ảnh”: Vùng này sẽ hiển thị ảnh đầu vào. Sau khi thực hiện đo đạc nó sẽ hiển thị ảnh nhị phân đã đƣợc khử nhiểu dùng cho quá trình đánh giá chiều rộng/dài của vết nứt.
“Kết quả” : Vùng chứa các thông số đo bao gồm:
Chiều dài: chiều dài của vết nứt.
Chiều rộng: Chiều rộng của vết nứt.
Phân loại: kết quả phân loại vết nứt là nứt đơn, nứt đa (nứt có rẽ nhánh) hoặc khơng nứt (khơng có vết nứt).
Hình bên dƣới minh họa việc hiển thị các kết quả đo đạc, phân loại của phần mềm.
57
PHỤ LỤC II: MÃ NGUỒN CỦA CHƢƠNG TRÌNH
a. Hàm xác định tỉ lệ pixel/cm
function [scale,c_pos, c_rad]= crack_calibration(img,RAD_REF)
%RAD_REF = 0.68/2; % reference radius in (cm) %RAD_REF = 1.36; % reference radius in (cm) %detect red circle
binFrameRed = imsubtract(img(:,:,1), rgb2gray(img)); % Get red component of the image
binFrameRed = medfilt2(binFrameRed, [3 3]); % Filter out the noise by using median filter
binFrameRed = im2bw(binFrameRed, 0.1); % Convert the image into binary image with the red objects as white
%get centroid and radius
stats =
regionprops('table',binFrameRed,'Centroid','MajorAxisLength','MinorAxisLength'); eenters = stats.Centroid;
diameters = mean([stats.MajorAxisLength stats.MinorAxisLength],2);
[~,cir_idx] = max(diameters);
radii = diameters(cir_idx)/2; if(~isempty(radii))
scale = diameters(cir_idx)/RAD_REF; % pixels/cm c_pos = ceil(centers(cir_idx,:));
58 c_rad = floor(radii); % imshow(img); % hold on % viscircles(centers(cir_idx),radii); % hold off else scale = 1.0; % pixels/cm c_pos = [0 0]; c_rad = 0; end end
b. Hàm thực hiện phân loại vết nứt
function [crk_type,str_type] = crack_classify(cln_img) load 'trained_mlp.mat'
[w,h] = size(cln_img);
if(w>h) cln_img = cln_img'; end
cln_img = imresize(cln_img,[192 256]); ske_img =bwmorph( cln_img,'thin',inf); % clean spurious edge
B = bwmorph(ske_img, 'branchpoints'); E = bwmorph(ske_img, 'endpoints'); [y,x] = find(E);
B_loc = find(B);
59
for k = 1:numel(x)
%calc distance from endpoint to another pixel
D = bwdistgeodesic(ske_img,x(k),y(k),'quasi-euclidean'); %find distance for EndPoint to closest BrandPoind
distanceToBranchPt = min(D(B_loc)); %Filter if distance less than 150pixel if(distanceToBranchPt < 2)
Dmask(D < distanceToBranchPt) =true; end
end
cln_img = ske_img - Dmask;
testData = cln_img(:);
predict_out = sim(net,testData); [~,crk_type] = max(predict_out);
if(crk_type == 1)
str_type = 'Khong nut'; else if (crk_type == 2) str_type = 'Nut don'; else
str_type = 'Nut da'; end
end
60 function [crk_img,scale]=crack_detection(img,calib_en,RedDotSize) % nomalize image img = im2double(img); %% convert RGB to Gray gry_img = rgb2gray(img);
%% median filter => smooth image med_img = medfilt2(gry_img,[5,5]);
%% binary image
% graythresh uses Otsu's method
bin_img = im2bw(med_img,graythresh(gry_img)); fil_img = ~bin_img; %crack is display in while color
%% Apply Filters
if(calib_en) % Calibration
[scale,c_pos,c_rad]= crack_calibration(img,RedDotSize); % clean scale indicator region
y0 = c_pos(1) - c_rad; y1 = c_pos(1) + c_rad; x0 = c_pos(2) - c_rad; x1 = c_pos(2) + c_rad; if(y0 < 1) y0 = 1; end if(x0 < 1) x0 = 1; end
61
if(x1 > size(fil_img,1)) x1 = size(fil_img,1); end if(y1 > size(fil_img,2)) y1 = size(fil_img,2); end fil_img(x0:x1,y0:y1) = 0; else scale = 1.0; end % apply knn_noise_filter fil_img = knn_noise_filter(fil_img);
% Clean noise by sharp
stat1 = regionprops(fil_img,'BoundingBox'); for k = 1 : length(stat1) x = ceil(stat1(k).BoundingBox(1)); y= ceil(stat1(k).BoundingBox(2)); widthX = floor(stat1(k).BoundingBox(3)-1); widthY = floor(stat1(k).BoundingBox(4)-1); if(widthX > widthY) factor = widthX/widthY; else factor = widthY/widthX; end if(factor < 5) subimage = fil_img(y:y+widthY,x:x+widthX,:);
62 numCrackPixel = sum(subimage(:)); if(numCrackPixel > 0.3*(widthY*widthX)) fil_img(y:y+widthY,x:x+widthX,:) = 0; end end end
% clean region less than 200 pixel area_thes = (scale*scale)/4;
L1=bwlabel(fil_img);
stat1 = regionprops(fil_img,'Area'); area = cat(1,stat1.Area);
v1 = find(area>=area_thes); %Find the area larger than 200 (Less than 200 is noise
fil_img = ismember(L1,v1); %apply filter
crk_img = fil_img; d. Hàm đo đạc kích thƣớc của vết nứt: function [crk_wid,crk_len]=crack_measurement(fil_img,scale) %% PARAM STEP = 5; N_CLOSEST = 5; DEBUG = 0; %% Crack measurement
63 stat1 = regionprops(fil_img,'FilledImage'); wid = zeros(1,size(stat1,1)); len = zeros(1,size(stat1,1)); area = zeros(1,size(stat1,1)); for i=1:size(stat1,1) subimage = stat1(i).FilledImage;
ske_img =bwmorph( subimage,'thin',inf);
% clean spurious edge
B = bwmorph(ske_img, 'branchpoints'); E = bwmorph(ske_img, 'endpoints'); [y,x] = find(E); B_loc = find(B); Dmask = false(size(ske_img)); for k = 1:numel(x)
%calc distance from endpoint to another pixel
D = bwdistgeodesic(ske_img,x(k),y(k),'quasi-euclidean'); %find distance for EndPoint to closest BrandPoind
DistanceToBranchPt = min(D(B_loc)); %Filter if distance less than 150pixel if(distanceToBranchPt < scale)
Dmask(D < distanceToBranchPt) =true; end
end
64 [x,y] = find(skelD); B = bwmorph(ske_img, 'branchpoints'); [br_x,br_y] = find(B); ro = cell(floor(length(x)/STEP)); co = cell(floor(length(x)/STEP)); do = zeros(1,floor(length(x)/STEP));
%figure; imshow(subimage); title('Process'); hold all; %plot(br_y,br_x,'r*'); for j=1:STEP:length(x) c_pos = [x(j) y(j)]; if(isempty(br_x)) [ro{j},co{j},do(j)] = getWidth(subimage,c_pos,N_CLOSEST); %plot(co{j},ro{j},'b'); else
%don't care if c_pos too close with branch point des_p = [br_x br_y];
ref_p = ones(size(des_p,1),1) * c_pos; Dis = sqrt(sum((ref_p - des_p).^2,2));
if(min(Dis) > 5) [ro{j},co{j},do(j)] = getWidth(subimage,c_pos,N_CLOSEST); %plot(co{j},ro{j},'r'); %plot(y(j),x(j),'b.'); end end
65 end wid(i) = median(do(do>0)); len(i) = sum(ske_img(:)); area(i)= sum(subimage(:)); end [~,idx] = max(area); total_wid = mean(wid(idx)); total_len= 0; for i=1:length(len) if(~isnan(wid(i)))
err = 100*abs(mean(wid(i)) - total_wid)/total_wid; if(err < 5)
total_len = total_len + len(i); end
end end
crk_len = total_len/scale; crk_wid = total_wid/scale;
66
PHỤ LỤC III: TẬP ẢNH THỬ NGHIỆM
Ảnh cad_01.jpg
Ảnh cad_02.jpg
67
Ảnh cad_04.jpg
Ảnh cad_05.jpg
68
Ảnh test_02.jpg
Ảnh test 03.jpg
69
Ảnh test_05.jpg
Ảnh test_07.jpg
70