How to black out bright spots on an image

12 Ansichten (letzte 30 Tage)
Steven Manz
Steven Manz am 22 Mai 2020
Bearbeitet: Ameer Hamza am 22 Mai 2020
Hi there,
I am simply wondering if it is possible to black out a bright spot on a bmp image and still keep the original image. Basically if I try
M = raw_image(raw_image < threshold)
It will return a 1D array of all points that are less than the threshold. I have used regionfill, but this still fills out the space in question. I can creat a mask for the image. But how do I multiply that mask to the original image to get values of 0 at the bright spots, and keep the original values everywhere else. See the attached image to see the bright spot I am speaking of. It seems to me that a good mask can be created by just asking for all values less than 15. But then how can I use the 0's from the mask to completely black out the original image at those positions and still keep the original intensities elsewhere?
For better reference, here is the code I have been using for regionfill that has worked great. I simply now want to black out the bright spot instead of making the image seemless.
% prepare directory info
path_info = fullfile(path, '70mm.bmp');
dir_info = dir(path_info);
% read images
filename = strcat(path, dir_info.name);
% transpose used to watch the images as they move downward. This is only
% done because the images seem to move downward. In future, laser can be
% oriented such that the transpose is not necessary.
raw_image = imread(filename)';
figure()
imshow(raw_image*10)
avg = sum(sum(raw_image))/nnz(raw_image);
M1 = raw_image > avg;
[y,x] = ndgrid(1:size(M1, 1), 1:size(M1, 2));
centroid = mean([x(M1),y(M1)]);
x = nnz(M1(floor(centroid(1)),:));
y = nnz(M1(:,floor(centroid(2))));
avg = mean(mean(raw_image(centroid(1)-x/2:centroid(1)+x/2,centroid(2)-y/2:centroid(2)+y/2)));
std = std2(raw_image(centroid(1)-x/2:centroid(1)+x/2,centroid(2)-y/2:centroid(2)+y/2));
threshold = avg + 2*std; %max(max(raw_image))/2;
M = raw_image > threshold;
Mp1 = regionfill(raw_image,M);
figure()
imshow(Mp1*10)
Thank you!

Akzeptierte Antwort

Ameer Hamza
Ameer Hamza am 22 Mai 2020
Bearbeitet: Ameer Hamza am 22 Mai 2020
You can use the following indexing like this to set pixels above the threshold to zero directly
raw_image(raw_image > threshold) = 0;
Also, you can multiply a mask with an image like this
mask = raw_image < threshold;
new_image = raw_image.*mask;

Weitere Antworten (0)

Kategorien

Mehr zu Scripts finden Sie in Help Center und File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by