使用MATLAB处理图像中圆圈内的颜色

时间:2016-03-10 19:35:44

标签: matlab image-processing

我正在使用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?

1 个答案:

答案 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

但是这相当丑陋,如果圆圈没有完全包含在图像中,则需要额外的测试。