我正在使用matlab更改图像中的颜色饱和度和其他特性。我已经这样做了。
close all
clear all
clc
A = imread('fractalHD.png');
B = A;
[f,c,p] = size(A);
R = uint8(zeros(f,c,p));
Value = 120;
for i=1:round(f/2)
for j=1:round(c)
for k=1:p
R(i,j,k) = B(i,j,k) - Value;
end
end
end
for i=round(f/2):f
for j=1:round(c)
for k=1:p
R(i,j,k) = B(i,j,k);
end
end
end
figure; imshow(R);
这会占用图像的上半部分并将颜色强度降低一个值。我想这样做,但是,不是上半部分(或任何方形部分),而是在一个中心位于左上方的圆圈内进行。
rad = 500;
theta = 0:2*pi/10000:2*pi;
for i=1:rad*cos(theta)
for j=1:rad*sin(theta)
for k=1:p
R(i,j,k) = B(i,j,k) - value;
end
end
end
imshow(R);
使用此代码仅返回黑色图像。任何sugestions?
答案 0 :(得分:2)
我就是这样做的,没有循环,只有bsxfun
:
% Center and radius of circle
center = [200, 600];
rad = 500;
% determine which coordinates are within circle (returns a logical array)
indmat = bsxfun(@(row,col) sqrt((row - center(1)).^2 + (col-center(2)).^2) <= rad, (1:f)', 1:c);
% scalar multiply to get double array, convert to uint8, and subtract with
% singleton expansion (along dimension 3)
R = bsxfun(@minus, B, uint8(indmat * Value)) ;
figure; imshow(R);
for循环的问题是外部计算为1:500
而第二个计算为1:0
(因为theta
本身是向量而1:vector
is equivalent to 1:vector(1)
。所以什么都没有得到计算。
如果你真的想用循环来做,你必须在外循环中去1:2*rad
并适当地确定内循环的长度,例如
R = B;
for ii=1:2*rad
for jj=-round(sqrt((rad)^2 - (rad-ii)^2)):round(sqrt((rad)^2 - (rad-ii)^2))
for k=1:p
R(ii,jj+rad+1,k) = R(ii,jj+rad+1,k) - Value;
end
end
end
但是这相当丑陋,如果圆圈没有完全包含在图像中,则需要额外的测试。