How to sum and plot all pixels of an area in image and plot them?
조회 수: 21 (최근 30일)
이전 댓글 표시
A new aproach and a NEW question of my previous query.
What I actually want to achieve is to get for every column of the image (see attached image) the sum of all its pixels. But not for the entire image. I want for part inside the red contour.
The counting should start from the bottom of the red segmented contour up until the top red contour. Is there a way to put a marker somewhere in the first one third of the image and tell Matlab to count from that point down to the bottom of the red contour, the total of pixels for every column and plot them.
YOu can see at image A3.jpg, I have marked with green pen the top point and the bottom point, of the area the pixel should be measured.
Is my question clear?
댓글 수: 1
Adam
2019년 1월 9일
If you have the red surrounding line in Matlab you can just use it as a mask on your original image to remove all the data outside of it, then just sum down each column as you would for a full matrix.
채택된 답변
Image Analyst
2019년 1월 10일
From your other question, you already have the masked image. So to sum vertically, just use sum(). To plot, use plot():
horizontalProfile = sum(maskedImage, 1); % Sum vertically.
plot(horizontalProfile, 'b-', 'LineWidth', 2);
xlabel('Column', 'FontSize', 20);
ylabel('Sum of gray levels in column', 'FontSize', 20);
댓글 수: 8
Image Analyst
2019년 1월 12일
You have the masked image already from my other answer. If you want to start summing from y = 123 to the bottom of the mask, just do this
row1 = 123; % Whatever...
s = zeros(1, columns); % Initialize sums for every column.
for col = 1 : columns
row2 = find(mask(:, col), 1, 'last'); % Get bottom row of mask
if ~isempty(row2)
% Get the sum from row1 to row2
s(col) = sum(grayImage(row1:row2, col));
end
end
추가 답변 (1개)
Walter Roberson
2019년 1월 9일
You can threshhold on bright white. Suppose you do that getting threshimg that is 1 where the bright white is. Then
counts = sum(cumprod(~threshimg))
will be the per-column count of pixels from the top to the first bright white pixel in the column.
The sum of the cumprod of the negated image is a clever vectorized way of doing the equivalent of
nr = size(threshimg,1); nc = size(threshimg,2);
for K = 1 : nc
counts(K) = find([threshimg(:,K);true], 1) - 1; %force artificial boundary in case no line
end
댓글 수: 6
Walter Roberson
2019년 1월 12일
Your s is 3D, since it is an RGB image. sum(s) is going to be 3D as well, since the default summation dimension is the first non-singular dimension, which is going to be the first dimension,leaving you with 1 x columns x 3 in size. You cannot store that into a scalar location s(i,j) .
Watch out: length(s) means
temp = size(s);
if any(temp == 0)
s_length = 0;
else
s_length = max(temp);
end
It does not mean the number of rows or columns in s.
If, somehow, you were able to store the result of the sum() into the scalar location, then you would be modifying progressively modifying the same array that you are using sum() over, and you would be adding 1 to each location as well. The code just does not make any sense.
참고 항목
카테고리
Help Center 및 File Exchange에서 Read, Write, and Modify Image에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!