使用 MATLAB 实现测定烟尘纳米结构包括条纹长度、曲折度和层间间距并给出代码。进行的晶格条纹分析包含以下图像处理步骤:a感兴趣区域选择b使用直方图均衡增强对比度c高斯低通滤波器d底帽变换e使用Otsu方法进行二值化f骨架化g消除孤立像素和具有3个以上连接的像素。条纹长度的计算方法是条纹所包含的像素数乘以像素长度对于对角线像素长度计算为像素大小的 2 倍。所有短于 0483 nm 的条纹两个芳香
以下是使用 MATLAB 实现测定烟尘纳米结构的代码:
-
感兴趣区域选择 roi = imrect; mask = createMask(roi, Im);
-
直方图均衡增强对比度 Im = histeq(Im);
-
高斯低通滤波器 h = fspecial('gaussian', 11, 1.5); Im = imfilter(Im, h);
-
底帽变换 se = strel('disk', 15); Im = imtophat(Im, se);
-
使用Otsu方法进行二值化 level = graythresh(Im); bw = im2bw(Im, level);
-
骨架化 bw = bwmorph(bw, 'skel', Inf);
-
消除孤立像素和具有3个以上连接的像素 bw = bwareaopen(bw, 2); bw = bwmorph(bw, 'spur', 5);
-
条纹长度计算 [L, num] = bwlabel(bw); stats = regionprops(L, 'Area', 'PixelIdxList'); for i = 1:num if stats(i).Area > 2 % 保留长度大于1的条纹 p = stats(i).PixelIdxList; [y, x] = ind2sub(size(L), p); len = sqrt((max(x)-min(x))^2 + (max(y)-min(y))^2); if len > 0.483 % 剔除长度小于0.483 nm的条纹 length_list = [length_list; len]; end end end
-
条纹曲折度计算 for i = 1:length(length_list) p = stats(i).PixelIdxList; [y, x] = ind2sub(size(L), p); C = length_list(i); L = sqrt((x(1)-x(end))^2 + (y(1)-y(end))^2); curvature = C/L; end
-
条纹间距计算 theta = 45; for i = 1:num if stats(i).Area > 2 p = stats(i).PixelIdxList; [y, x] = ind2sub(size(L), p); len = sqrt((max(x)-min(x))^2 + (max(y)-min(y))^2); if len > 0.3354 && len < 0.6 % 只选择大于002石墨距离和小于0.6 nm的条纹 for j = i+1:num if stats(j).Area > 2 q = stats(j).PixelIdxList; [y2, x2] = ind2sub(size(L), q); len2 = sqrt((max(x2)-min(x2))^2 + (max(y2)-min(y2))^2); if len2 > 0.3354 && len2 < 0.6 && abs(len-len2) < 0.1 % 只选择长度相差小于0.1 nm的条纹 if abs(atan2(y(1)-y(end), x(1)-x(end)) - atan2(y2(1)-y2(end), x2(1)-x2(end))) < deg2rad(theta) % 只选择方向相似的条纹 [D, Z, transform] = procrustes([x, y], [x2, y2]); distance = mean(sqrt(sum((Z-[x, y]).^2, 2))); if distance > 0.2 && distance < 0.6 % 只选择间距在0.2-0.6 nm之间的条纹 separation_list = [separation_list; distance]; plot(x, y, 'b', x2, y2, 'g'); end end end end end end end end
原文地址: https://www.cveoy.top/t/topic/bjZb 著作权归作者所有。请勿转载和采集!