2017-03-18 22 views
-1

私はこの画像を持っています。 Image of a map画像の領域認識

私がしたい: - 1.このイメージにすべての領域を認識する 2.他の領域に接続されている領域

私の目標は、この画像と出力Aで4色定理を適用することで認識適切に着色された画像。私はpythonとopencvの初心者です。

この件に関するお手伝いをいただければ幸いです。

答えて

0

ここにあなたが望むことをするMATLABコードがあります。 Python + OpenCVの中でそれを実装するにはあまりにも複雑ではありません。

% read image 
m = rgb2gray(imread('map.jpg')); 
% remove noise 
m = medfilt2(m); 
b = m < 250; 
se1 = strel('disk',1,0); 
se2 = ones(7); 
b = imclose(imopen(b,se1),se2); 
% skeletonize 
B = bwmorph(b,'skel',inf); 
% remove background 
R = padarray(~B,[1 1],1); 
bg = bwselect(R,1,1,4); 
R(bg) = 0; 
R = R(2:end-1,2:end-1); 
% get regions connected components 
ccRegions = bwconncomp(R,4); 
maskRegions = false([size(R),ccRegions.NumObjects]); 
MAP = zeros(size(R)); 
% generate a binary mask for each region, dilate it to detect overlaps 
% between neigbors 
for ii = 1:ccRegions.NumObjects 
    maskRegions((ii - 1)*numel(R) + (ccRegions.PixelIdxList{ii})) = 1; 
    maskRegions(:,:,ii) = imdilate(maskRegions(:,:,ii),se1); 
    MAP(maskRegions(:,:,ii)) = ii; 
end 
% detect neighbors using masks overlapping 
neighborsRegions = cell(ccRegions.NumObjects,1); 
for ii = 1:ccRegions.NumObjects 
    r = repmat(maskRegions(:,:,ii),[1 1 ccRegions.NumObjects]); 
    idxs = any(any(r & maskRegions,1),2); %indexes of touching neighbors 
    idxs(ii) = 0; % remove self index 
    neighborsRegions{ii} = find(idxs); 
end 
% show result 
imshow(MAP,[]) 
c = regionprops(ccRegions,'Centroid'); 
for ii = 1:ccRegions.NumObjects 
    text(c(ii).Centroid(1),c(ii).Centroid(2),num2str(ii),'FontSize',20,'Color','r'); 
end 

出力は以下のようになります。enter image description here

そして、それぞれの地域の隣国である:

neighborsRegions = {[2;3] 
        [1;3;4] 
        [1;2;4;5;6] 
        [2;3;6] 
        [3;6] 
        [3;4;5] 
        []} 
+0

本当にありがとうございました兄。 –