efficient use of extracting mean over segments
3 ビュー (過去 30 日間)
古いコメントを表示
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
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.
採用された回答
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 件のコメント
Image Analyst
2013 年 2 月 25 日
Something like (untested)
newImage = intlut(labeledImage, allMeanIntensities);
その他の回答 (1 件)
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.
参考
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!