2

내 주요 질문은 기능 중심을 제공합니다. 어떻게 MATLAB에서 그릴 수 있습니까?MATLAB : 도심을 그리기

좀 더 자세하게 설명하면, NxNx3 이미지 (RGB 이미지)는 4x4 블록을 취하고 각 블록에 대해 6 차원의 특성 벡터를 계산합니다. 이 기능 벡터를 kmeans 함수를 실행하고 kx6 행렬로 구할 때 Mx6 행렬에 저장합니다. k은 클러스터 수이고 6은 각 블록의 피쳐 수입니다.

알고리즘에서 수행하려는 방식대로 알고리즘을 수행하고 있는지 시각화하기 위해이 센터 클러스터를 이미지에 어떻게 그리 수 있습니까? 또는 누군가 내 이미지의 중심을 어떻게 시각화 할 수 있는지에 대한 다른 방법이나 제안이 있다면 크게 감사하겠습니다.

답변

3

다음은 클러스터를 시각화 할 수있는 하나 개의 방법 :

당신이 설명한 바와 같이, 처음에는 블록을 추출은, 각각의 특징 벡터를 계산하고,이 매트릭스 기능 클러스터.

다음으로 각 블록에 할당 된 클러스터를 시각화 할 수 있습니다. 4x4 블록이 구별되어 있다고 가정합니다. 블록을 원본 이미지의 위치에 다시 매핑 할 수 있도록하는 것이 중요합니다.

마지막으로 이미지에 클러스터 중심을 표시하기 위해 각 클러스터에 가장 가까운 블록을 찾고 해당 클러스터의 대표자로 표시하기 만하면됩니다.

위의 아이디어를 보여주는 완전한 예제가 있습니다. 각 블록의 기능을 계산하는 함수를 직접 구현하여 대신 사용하려는 경우, 최소/최대/평균/중앙값/각 4 × 4 블록 내 특징 벡터로 Q1/Q3) :

%# params 
NUM_CLUSTERS = 3; 
BLOCK_SIZE = 4; 
featureFunc = @(X) [min(X); max(X); mean(X); prctile(X, [25 50 75])]; 

%# read image 
I = imread('peppers.png'); 
I = double(rgb2gray(I)); 

%# extract blocks as column 
J = im2col(I, [BLOCK_SIZE BLOCK_SIZE], 'distinct'); %# 16-by-NumBlocks 

%# compute features for each block 
JJ = featureFunc(J)';        %'# NumBlocks-by-6 

%# cluster blocks according to the features extracted 
[clustIDX, ~, ~, Dist] = kmeans(JJ, NUM_CLUSTERS); 

%# display the cluster index assigned for each block as an image 
cc = reshape(clustIDX, ceil(size(I)/BLOCK_SIZE)); 
RGB = label2rgb(cc); 
imshow(RGB), hold on 

%# find and display the closest block to each cluster 
[~,idx] = min(Dist); 
[r c] = ind2sub(ceil(size(I)/BLOCK_SIZE), idx); 
for i=1:NUM_CLUSTERS 
    text(c(i)+2, r(i), num2str(i), 'fontsize',20) 
end 
plot(c, r, 'k.', 'markersize',30) 
legend('Centroids') 

clusters image

0

무게 중심은 이미지의 좌표가 아니고 형상 공간의 좌표와 일치합니다. kmeans가 얼마나 잘 수행되었는지 테스트 할 수있는 두 가지 방법이 있습니다. 두 가지 방법 모두, 가장 가까운 클러스터와 포인트를 연결하고 싶을 것입니다. 이 정보는 kmeans의 첫 번째 출력에서 ​​가져옵니다.

(1) 6 차원 공간을 2 차원 또는 3 차원 공간으로 축소 한 다음 서로 다른 색으로 분류 된 좌표를 플로팅하여 클러스터링 결과를 시각화 할 수 있습니다.

%# kmeans clustering 
[idx,centroids6D] = kmeans(featureArray,nClusters); 
%# find the dissimilarity between features in the array for mdscale. 
%# Add the cluster centroids to the points, so that they get transformed by mdscale as well. 
%# I assume that you use Euclidean distance. 
dissimilarities = pdist([featureArray;centroids6D]); 
%# transform onto 3D space 
transformedCoords = mdscale(dissimilarities,3); 
%# create colormap with nClusters colors 
cmap = hsv(nClusters); 
%# loop to plot 
figure 
hold on, 
for c = 1:nClusters 
    %# plot the coordinates 
    currentIdx = find(idx==c); 
    plot3(transformedCoords(currentIdx,1),transformedCoords(currentIdx,2),... 
     transformedCoords(currentIdx,3),'.','Color',cmap(c,:)); 
    %# plot the cluster centroid with a black-edged square 
    plot3(transformedCoords(1:end-nClusters+c,1),transformedCoords(1:end-nClusters+c,2),... 
     transformedCoords(1:end-nClusters+c,3),'s','MarkerFaceColor',cmap(c,:),... 
     MarkerEdgeColor','k'); 
end 
: 특징 벡터가 featureArray라는 배열에 수집되고, 말,로 데이터를 변환 mdscale을 사용하여 다음과 같이 nClusters 클러스터를 요청, 당신은, 3D 공간을 플롯 할 거라고 가정하면

(2) 당신은 대안있는 클러스터

nRowsnCols에 의해 블록이 있다고 가정하면, 당신은

쓰기에 속하는 이미지의 어떤 부분을 보여줍니다 의사 컬러 이미지를 만들 수 있습니다3210
%# kmeans clustering 
[idx,centroids6D] = kmeans(featureArray,nClusters); 
%# create image 
img = reshape(idx,nRows,nCols); 
%# create colormap 
cmap = hsv(nClusters); 

%# show the image and color according to clusters 
figure 
imshow(img,[]) 
colormap(cmap)