MATLAB Answers

How to apply a different b/w threshold to each row of the image?

24 views (last 30 days)
Nut on 13 Jun 2016
Commented: Image Analyst on 22 Jan 2020 at 19:57
Hi,
I would convert an image from grayscale to black-and-white using the im2bw function, and I need to apply a different threshold to each row of the image. Which is the most efficient way to do this? Is there a way to avoid the "for" cycle?
Thank you very much.

2 Comments

Roman Boldin on 22 Jan 2020 at 19:43
Hello, do you still have the code of for and loop?
Image Analyst on 22 Jan 2020 at 19:57
Roman, it would be something like
[rows, columns, numberOfColorChannels] = size(theImage);
binaryImage = false(rows, columns);
for row = 1 : rows
% Get the threshold for this row - however you do it (I don't know).
thisThreshold = whatever;
% Now threshold/binarize the image for this row only.
binaryImage(row, :) = theImage(row, :) > thisThreshold;
end

Sign in to comment.

Accepted Answer

Andrew Bliss on 13 Jun 2016
Depending on the input type of your image, you may be able to just do a simple thresholding operation (as below), otherwise you'll have to delve a little deeper into image processing.
asdf=imread('example.tif');
figure,imshow(asdf)
zxcv=rgb2gray(asdf);
figure,imshow(zxcv)
thresh=[50*ones(325,1);150*ones(325,1)]; %here you set the threshold for each row
threshMatrix=repmat(thresh,1,600);
BW=zxcv>threshMatrix;
figure,imshow(BW)

2 Comments

Nut on 14 Jun 2016
Thank you very much for your answer, it may be a good way. I'll compare this with the for loop.
Nut on 14 Jun 2016
You're right. The execution time with your solution is about 1.6 seconds, instead using im2bw and the for loop it is about 5.1 seconds. Very good idea, thank you again.

Sign in to comment.

More Answers (1)

Image Analyst on 14 Jun 2016
Edited: Image Analyst on 14 Jun 2016
No, you'll have to use a for loop. It's not a problem though. It will be very fast. No need to worry about for loops that are only a few thousand iterations.
Why do you need a different threshold for each row anyway?
You might be able to use a different function. There are new binarization functions. See Steve's blog:

7 Comments

Show 4 older comments
Nut on 15 Jun 2016
All you said is correct. I mentioned im2bw because before your answer it was the only function I knew to convert from grayscale to binary. I usually perform it manually setting the threshold, instead of using graythresh. But I just need the most efficient way, also without using im2bw. As you said, I know the thresholds in advance.
The mine is a very targeted issue, so I need to manually set proper thresholds. These depend on the image data, but not directly. To get them, I investigated several past cases. I saw that, if average intensity of pixels around the object is "x" (in my case, it can be assumed as mean(I,2) value), a good threshold could be a value around "y".
I collected all "x-y" couples and interpolate them using polyfit, and I use the resulting polynomial to get the y values (thresholds) I need.
Image Analyst on 15 Jun 2016
OK. I have a nice manual/interactive thresholding utility in my File Exchange if you're interested: http://www.mathworks.com/matlabcentral/fileexchange/29372-thresholding-an-image
Nut on 16 Jun 2016
I'll try it, thank you!

Sign in to comment.

Sign in to answer this question.