Replace multiple pixels value in an image with a certain value Matlab -
i have image 640x480 img, , want replace pixels having values not in list or array x=[1, 2, 3, 4, 5] value 10, pixel in img doesn't have of values in x replaced 10. know how replace 1 value using img(img~=1)=10 or multiple values using img(img~=1 & img~=2 & img~=3 & img~=4 & img~=5)=10 when tried img(img~=x)=10 gave error saying matrix dimensions must agree. if please advise.
you can achieve combination of permute , bsxfun. can create 3d column vector consists of elements of [1,2,3,4,5], use bsxfun not equals method (@ne) on image (assuming grayscale) create 3d matrix of 5 slices. each slice tell whether locations in image do not match element in x. first slice give locations don't match x = 1, second slice give locations don't match x = 2, , on.
once finish this, can use all call operating on third dimension consolidate pixel locations not equal of 1, 2, 3, 4 or 5. last step take logical map, tells locations none of 1, 2, 3, 4, or 5 , we'd set locations 10.
one thing need consider image type , vector x must same type. can ensure casting vector same class img.
as such, this:
x = permute([1 2 3 4 5], [3 1 2]); vals = bsxfun(@ne, img, cast(x, class(img))); ind = all(vals, 3); img(ind) = 10; the advantage of above method list want use check elements can whatever want. prevents having messy logical indexing syntax, img(img ~= 1 & img ~= 2 & ....). have change input list @ beginning line of code, , bsxfun, permute , any should work you.
here's example 5 x 5 image:
>> rng(123123); >> img = randi(7, 5, 5) img = 3 4 3 6 5 7 2 6 5 1 3 1 6 1 7 6 4 4 3 3 6 2 4 1 3 by using code above, output is:
img = 3 4 3 10 5 10 2 10 5 1 3 1 10 1 10 10 4 4 3 3 10 2 4 1 3 you can see elements neither 1, 2, 3, 4 or 5 set 10.
aside
if don't permute , bsxfun approach, 1 way have for loop , true array, keep logical anding final result logical map consists of locations not equal each value in x. in end, have logical map true locations neither equal 1, 2, 3, 4 or 5.
therefore, this:
ind = true(size(img)); idx = 1 : 5 ind = ind & img ~= idx; end img(ind) = 10; if instead, you'll see same answer.
Comments
Post a Comment