フィルターのクリア

efficient use of extracting mean over segments

1 回表示 (過去 30 日間)
Sukuchha
Sukuchha 2013 年 2 月 20 日
Hello, I have image (Iseg) where i have number of segments. Each segments is represented by unique number in Iseg. The segments are around (50000). I have another image(Idata) which is same size that of Iseg. For every segment in Iseq i want to extract mean value of segments from Idata.
Rightnow i am using like this
NumRegion = max(max(Iseg));
mean_magnitude = zeros(size(Iseg));
for i=1:NumRegion
[iIndList] = find(Iseg == i);
mean_magnitude(iIndList) = mean(Idata(iIndList));
end
It works fine, but the problem is that it takes a long time. about 10 mins in my machine. Is there a effecient way to do it.
  3 件のコメント
Image Analyst
Image Analyst 2013 年 2 月 22 日
編集済み: Image Analyst 2013 年 2 月 23 日
I'm not sure either. Is a "segment" a blob in a binary image? And he wants the mean gray level of a gray level image for each blob region? Sounds like Iseg is a "labeled" image like you'd get from bwlabel (connected components labeling) where each blob has a unique ID number assigned at every pixel in the blob.
Sukuchha
Sukuchha 2013 年 2 月 25 日
Image Analyst, you are right. Iseg is a grayscale image, where each blob has a unique ID number assigned at every pixel in the blob.

サインインしてコメントする。

採用された回答

Image Analyst
Image Analyst 2013 年 2 月 22 日
編集済み: Image Analyst 2013 年 2 月 22 日
Do you, by chance, mean this:
measurements = regionprops(Iseg, Idata, 'MeanIntensity);
allMeanIntensities= = [measurements.MeanIntensity];
  5 件のコメント
Sukuchha
Sukuchha 2013 年 2 月 25 日
i had a look at intlut before but couldnot figure out how to use it. Could you please show one example(or pseudo code)?
Image Analyst
Image Analyst 2013 年 2 月 25 日
Something like (untested)
newImage = intlut(labeledImage, allMeanIntensities);

サインインしてコメントする。

その他の回答 (1 件)

Jan
Jan 2013 年 2 月 22 日
At first you can cleanup the loop a little bit using logical indexing:
NumRegion = max(max(Iseg));
mean_magnitude = zeros(size(Iseg));
for i = 1:NumRegion
iIndList = (Iseg == i);
mean_magnitude(iIndList) = mean(Idata(iIndList));
end
I assume accumarray is faster. I'd try to run a loop over Iseq instead also, but I cannot test it due to the absence of test data. It might be helpful if you post some, e.g. produced by some rand calls.
  1 件のコメント
Sukuchha
Sukuchha 2013 年 2 月 25 日
編集済み: Sukuchha 2013 年 2 月 25 日
The looping is much slower. The code given by image analyst calculated mean intensities over each blob in much faster way but problem now to to make a raster image out of it. measurements = regionprops(Iseg, Idata, 'MeanIntensity); allMeanIntensities= = [measurements.MeanIntensity];

サインインしてコメントする。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by