最佳答案
看这结构还不是按颜色提取,是按连通区域选择的, 膨胀腐蚀 也就是预处理,避免一些图象粘连。 这方法还是比较好的,大体上交通标识 都有 外围一圈封闭 颜色, 这样 进行轮廓和填充后 就会得到一个连通区域, 根据区域大小,区域 长宽比 基本可以过滤其他干扰例如 树干 长宽比太大, 不过这种做法也是不靠谱的, 如果地上有个大小相似的有色气球 就 无法区分了 还应该 加一个连通区域轮廓获取 对该连通区域里面 颜色值分布做一个检验, 如果连通区域颜色总数高于多少,低于多少 排除。 一般这类标识 就2 到3 个颜色 这样能更好的过滤。 |
3 条回复
估计是按红色进行颜色提取,然后获取红色图象像素的范围,得到红色出现的 xy 范围并以此作为切割依据进行切割 |
gywxd 发表于 2022-5-8 16:32 就是它在分割的时候先进行了腐蚀膨胀运算,然后就直接进行分割了,代码如下: d = handles.GI; se = ones(3); % 腐蚀膨胀模版 d = imdilate(d,se);% 再做膨胀运算 d = imerode(d,se); % 先做腐蚀运算 % 先膨胀后腐蚀的过程称为开运算。用来填充物体内细小空洞、连接邻近物体、平滑其边界的同时并不明显改变其面积。 d = bwareaopen(d,100); % 移除小对象 小区域肯定是噪声 L = bwlabel(d,8); %标记连通 Num = max(max(L)); % 有几个区域 S = zeros(1,Num); for i = 1:Num S(i) = sum(sum(L == i)); end [S,id] = sort(S,'descend'); Ran = zeros(Num,4); % 范围 Fig = zeros(1,Num); % 长宽比 for i = 1:Num [ix,iy] = find(L == id(i)); Ran(i,:) = [min(ix),max(ix),min(iy),max(iy)]; % 每一个区域的范围 end for i = 1:Num Fig(i) = max(Ran(i,2)-Ran(i,1),Ran(i,4)-Ran(i,3))/min(Ran(i,2)-Ran(i,1),Ran(i,4)-Ran(i,3)); end in = 0; for i = 1:Num if Fig(i) < 1.5 % 长宽比是接近1的 所以不会太离谱 in = i; break; end end if in == 0 in = 1; % 如果都不满足就认定面积最大的一个了 这时候肯定是有干扰的 end axes(handles.axes3); imshow(L == id(in)); if handles.Color ~= 3 xmin = Ran(in,1); xmax = Ran(in,2); ymin = Ran(in,3); ymax = Ran(in,4); II = handles.I(xmin:xmax,ymin:ymax,:); elseif handles.Color == 3 % 黄色的多切一点 有黑色边框 xmin = Ran(in,1)-round((Ran(in,2)-Ran(in,1))*0.15); xmax = Ran(in,2)+round((Ran(in,2)-Ran(in,1))*0.15); ymin = Ran(in,3)-round((Ran(in,4)-Ran(in,3))*0.15); ymax = Ran(in,4)+round((Ran(in,4)-Ran(in,3))*0.15); II = handles.I(xmin:xmax,ymin:ymax,:); end axes(handles.axes4); imshow(II); % imwrite(II,'5.png','png') handles.Divice = II; guidata(hObject, handles); |
看这结构还不是按颜色提取,是按连通区域选择的, 膨胀腐蚀 也就是预处理,避免一些图象粘连。 这方法还是比较好的,大体上交通标识 都有 外围一圈封闭 颜色, 这样 进行轮廓和填充后 就会得到一个连通区域, 根据区域大小,区域 长宽比 基本可以过滤其他干扰例如 树干 长宽比太大, 不过这种做法也是不靠谱的, 如果地上有个大小相似的有色气球 就 无法区分了 还应该 加一个连通区域轮廓获取 对该连通区域里面 颜色值分布做一个检验, 如果连通区域颜色总数高于多少,低于多少 排除。 一般这类标识 就2 到3 个颜色 这样能更好的过滤。 |
Powered by Discuz! X3.4
© 2001-2022