How to black out bright spots on an image

조회 수: 3 (최근 30일)
Steven Manz
Steven Manz 2020년 5월 22일
편집: Ameer Hamza 2020년 5월 22일
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!

채택된 답변

Ameer Hamza
Ameer Hamza 2020년 5월 22일
편집: Ameer Hamza 2020년 5월 22일
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;

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Computer Vision with Simulink에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by