我正在尝试输出图像中对象中每个通道的平均值和标准偏差。目前,我的代码生成平均值和标准RGB作为一个数字,但相反,我想单独输出R,G,B的均值和标准。
示例数据:https://drive.google.com/file/d/0B_M7fjkKw1r3ZnM3N0I1aGkzbjA/edit?usp=sharing
这是我的代码:
function findspuds( image )
%findspuds function locates object boundaries and displays details in Command
%Windows
%read image
orginalImage = imread(image);
%convert to grayscale
grayImage = rgb2gray(orginalImage);
%convert to black/white with low threshold
blackWhiteImage = im2bw(grayImage,6/255);
%reverse binary values
reversedBlackWhiteImage = imcomplement(blackWhiteImage);
%compute distance transform to the nearest 0 pixel in the binary image
calReversedBlackWhiteImage = bwdist(reversedBlackWhiteImage);
%reverse back binary values
reversed2BlackWhiteImage = imcomplement(calReversedBlackWhiteImage);
%suppress pixel depth minimum
shallowImage = imhmin(reversed2BlackWhiteImage,10);
%compute a label matrix of watershed regions
waterImage = watershed(shallowImage);
%use watershed matrix to separate the touching objects in the binary image
blackWhiteImage(waterImage == 0) = 0;
%remove elements with fewer then 500 pixels
clnImage = bwareaopen(blackWhiteImage,500);
%remove holes in objects
filledImage = imfill(clnImage,'holes');
%get object boundaries
objectBoundries = bwboundaries(filledImage);
%label each object to get its measurements
labeledImage = bwlabel(filledImage);
%get all the object properties
objectMeasurements = regionprops(labeledImage, grayImage, 'all');
%align object labels in the centre of the object
labelShiftX = -7;
%display object boundaries on original image
imshow(orginalImage)
hold on
%print table header line in the command window
fprintf(1,'Object # Centroid Size Major/minor axis Circularity Mean/standard deviation\n');
%for each labelled object...
for thisObject = 1:length(objectBoundries)
%get and print its boundries
boundary = objectBoundries{thisObject};
plot(boundary(:,2), boundary(:,1), 'b', 'LineWidth', 2)
%get centroid
objectCentroid = objectMeasurements(thisObject).Centroid;
%get area
objectSize = objectMeasurements(thisObject).Area;
%get major axis length
objectMajorAxisLength = objectMeasurements(thisObject).MajorAxisLength;
%get minor axis length
objectMinorAxisLength = objectMeasurements(thisObject).MinorAxisLength;
%get circularity
objectCircularity = objectMeasurements(thisObject).Perimeter;
%get list of pixels in current object
objectPixels = objectMeasurements(thisObject).PixelIdxList;
%get mean intensity of grayImage
objectMean = mean(grayImage(objectPixels));
%get standard intensity of grayImage
objectStandard = std2(grayImage(objectPixels));
%print object properties
fprintf(1,'#%2d %8.1f %8.1f %10.1f %10.1f %8.1f %12.1f %15.1f %8.1f\n', thisObject, objectCentroid, objectSize, objectMajorAxisLength, objectMinorAxisLength, objectCircularity, objectMean, objectStandard);
%print object labels
text(objectCentroid(1) + labelShiftX, objectCentroid(2), num2str(thisObject), 'FontSize', 14, 'FontWeight', 'Bold', 'Color','w');
end
end
答案 0 :(得分:1)
mask = false(size(grayImage));
mask(objectPixels) = true;
%on R channel
tmp = orginalImage(:,:,1);
objectMeanR = mean(tmp(mask));
objectStandard = std2(tmp(mask));
同样,您可以在G和B频道上实施mean
和std2
。