MATLAB: طريقة فعالة لحساب أرقام غير صفرية على طول حدود الصفيف

StackOverflow https://stackoverflow.com/questions/19825429

سؤال

لدي صفيف تبدو صورتها كما هو موضح أدناه. تمثل القيم الموجودة في الصفيف عدد الجزيئات في كل بكسل/شبكة. أريد حساب توزيع الجزيئات غير الصفر على طول المحيط/الحدود (يشير المحيط/الحدود إلى توزيع أبعد النقاط من المركز) حيث توجد جزيئات غير صفرية. كإخراج من هذا ، أود الحصول على:

1) # من الجزيئات غير الصفر على طول المحيط/الحدود ، و

2) # من البكسل/الشبكات حيث توجد تلك الجسيمات

أي طريقة سريعة/فعالة للقيام بذلك؟

enter image description here

تحرير 1: لقطة تصف مثال الحدوديتتبع خط الحدود الجسيمات غير الصفر.enter image description here

هل كانت مفيدة؟

المحلول

بدءا من مصفوفة M من تعداد الجسيمات ، سيحصل هذا على قناع في Mb من الحدود كما تم تعريفها بالسؤال ،

% define particle count matrix and find non-zero locations
M = randi(5,10,10)-1
[nr,nc] = size(M);
[pRows,pCols] = find(M);

% identify locations that compose the "boundary" line
boundCoords = [accumarray(pCols,pRows',[nc 1],@min)', ...
               accumarray(pCols,pRows',[nc 1],@max)', ...
               1:nr 1:nr; ...
               1:nc 1:nc, ...
               accumarray(pRows,pCols',[nr 1],@min)', ...
               accumarray(pRows,pCols',[nr 1],@max)'];
boundCoords = unique(boundCoords','rows');
boundCoords(any(boundCoords==0,2),:)=[]; %' remove possible (unlikely) zeros

% create a mask representation of the boundary line
Mb = false(size(M));
Mb(sub2ind(size(Mb),boundCoords(:,1),boundCoords(:,2))) = true

هذا ما أفهمه أنك تريد أن يبدو قناعك الحدودي. عدد وحدات البكسل التي تشكل الحدود

numBorderPix = sum(Mb(:))

بعد ذلك

numBorderParticles = sum(M(Mb))

ملاحظة: سيضمن هذا الحل ذلك كل نقطة على خط الحدود لديها عدد الجسيمات غير الصفر.

نصائح أخرى

المحيط peri للفهرسة المنطقية للمصفوفة الخاصة بك M هو

peri = true(25);
peri(2:end-1, 2:end-1) = false;

ثم يعتبر الجسيمات n في المحيط n = M(peri). (1) العدد الإجمالي للجزيئات على طول الحدود sum(n). (2) عدد البكسلات حيث يقيمون sum(n > 0).

-لقد توصلت إلى هذه الخوارزمية لمشكلتك.

-تفاصيل ما تريده ليست واضحة بنسبة 100 ٪ بحيث لا تحسب ما تريده بالضبط.

-التفسير في التعليقات

A=full(sprand(10,10,0.9));

crossKernel=[0 1 0; 1 1 1; 0 1 0]; %% neighbor kernel
isBorder = (conv2(ones(size(A)),crossKernel,'same')~=5); %% find pixels on border
isZeroOnBorder = isBorder & (A==0); %% find zeros on border
%%% the pixels on the new border are...
isNewBorder = (conv2(double(isZeroOnBorder),crossKernel,'same')... %% next to a zero on border
              | isBorder )... %% or on the border of the matrix
              & (~isZeroOnBorder); %% and are not zeros on border
newBorderLength=nnz(isNewBorder) %% counting and obtaining result
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top