⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calculatepxtheta.m

📁 利用matlab实现彩色图像的分割。算法主要是利用聚类算法。
💻 M
字号:
function M = calculatePXTheta(im,prevClusters)% CALCULATEPXTHETA - Calculate the probability of each pixel being% its color conditioned on all of the clusters that were found at% the previous (coarser) iteration.%% Input:%      IM - MxNx3 image, where each pixel is a point in a%      perceptually uniform color space.%%      PREVCLUSTERS - MxNx3 matrix that contains binary masks%      representing a pixels membership in a certain cluster as of%      the previous scale.%% Output:%      M - MxNxC matrix, where the (i,j,k) entry is the probability%      of pixel (i,j) being its color given that it is a member of%      cluster k.%% Notes:%%      The internal variable BINS is rather important because it%      controls the courseness of the pdf estimation based on 3D%      histograms in color space. The colorspace cube is divided%      into BINS^3 sub-cubes for the estimation.  If BINS is large,%      then the probability of a given pixel given the clusters%      tends to be 1 for one cluster and 0 for all the rest (thus%      not really adding any information).      BINS = 50;  % the number of bins to use for the histrograms along  imSize = size(im);  imSize = imSize(1:2);  numPixels = prod(imSize);    im = reshape(im,prod(imSize),3);    CSPACE_MIN = -0.1; % minimum value allowed in the color space  CSPACE_MAX = 1.0; % maximum value allowed in the color space   C = length(prevClusters(1,1,:)); % the number clusters    % Create 3D color histograms for each of the clusters  edges = repmat([-inf linspace(CSPACE_MIN,CSPACE_MAX,BINS-1)]',1,3);    %prepare a matrix to hold all of the histogram data  hists = zeros(BINS,BINS,BINS,C);  % reshape the image so that we have three 1D vectors  for i=1:C    cluster_linear = reshape(prevClusters(:,:,i), ...			     prod(size(prevClusters(:,:,i))),1);    ind = find(cluster_linear);    % im_cluster will be a Px3 matrix, where each row is the color    % point (in R3) of a point within the image that is in the i^th    % cluster, and P is the total number of pixels in that cluster    im_cluster = im(ind,:);    cluster_size = length(im_cluster(:,1));        [n,x,nbins] = histmulti5(im_cluster,edges);    % the n that was returned is the BINSxBINSxBINS vector that    % contains counts for each bin    n = n / cluster_size;    hists(:,:,:,i) = n;    % normalize the histograms to turn them into probabilities  end         %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   % now, for each pixel in the image, figure out which   % histogram bin it falls into and use this information to assign   % a probability to this pixel coming from each of the clusters      M = zeros(numPixels,C);   edges = edges(:,1);   % there's probably a better way to do this than the dreaded   % for-loop, but i can't figure it out   for i=1:numPixels     for j=1:C       M(i,j) = hists(max(find(im(i,1)>edges)),(max(find(im(i,2)>edges))),(max(find(im(i,3)>edges))),j);     end   end      M = reshape(M,imSize(1),imSize(2),C);      % there is a normalization problem, so fix it here   sums = sum(M,3);      %%% hack alert!   [ii,jj] = find((sums < eps));      if (length(ii) > 0)     sums(sub2ind(size(sums),ii,jj)) = 1;     disp(sprintf('calculatePXTheta: found %d zero probabilities', ...		  length(ii)));   end        for i=1:C     M(:,:,i) = M(:,:,i) ./ sums;   end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -