如何创建斜条纹图案和棋盘图案?

时间:2015-12-02 12:58:29

标签: matlab image-processing matrix textures modulation

根据this问题,我可以确认水平模式可以加到矩阵(在本例中是一个图像)上,方法是将其乘以用这个创建的调制信号:

vModulationSignal = 1 + (0.5 * cos(2 * pi * (signalFreq / numRows) * [0:(numRows - 1)].'));

如果有人可以解释为什么上述调制信号有效,也会很棒。

现在我想创建对角线模式,例如:

enter image description here

这种十字交叉(格仔)模式:

enter image description here

使用类似的vModulationSignal

代码摘录创建调制信号的位置

numRows = size(mInputImage, 1);
numCols = size(mInputImage, 2);

signalFreq = floor(numRows / 1.25);

vModulationSignal = 1 + (0.5 * cos(2 * pi * (signalFreq / numRows) * [0:(numRows - 1)].'));

mOutputImage = bsxfun(@times, mInputImage, vModulationSignal);

代码摘录我试图创建十字交叉信号

numRows = size(mInputImage, 1);
numCols = size(mInputImage, 2);

signalFreq1 = floor(numRows / 1.25);
signalFreq2 = floor(numCols / 1.25);

vModulationSignal1 = 1 + (0.5 * cos(2 * pi * (signalFreq / numRows) * [0:(numRows - 1)].'));

vModulationSignal2 = 1 + (0.5 * cos(2 * pi * (signalFreq / numRows) * [0:(numRows - 1)].'));

mOutputImage = bsxfun(@times, mInputImage, vModulationSignal);

figure();
imshow(mOutputImage);

2 个答案:

答案 0 :(得分:2)

对于水平,垂直,斜条纹

fx = 1 / 20; % 1 / period in x direction
fy = 1 / 20; % 1 / period in y direction
Nx = 200; % image dimension in x direction
Ny = 200; % image dimension in y direction
[xi, yi] = ndgrid(1 : Nx, 1 : Ny);
mask = sin(2 * pi * (fx * xi  + fy * yi)) > 0; % for binary mask
mask = (sin(2 * pi * (fx * xi  + fy * yi)) + 1) / 2; % for gradual [0,1] mask
imagesc(mask); % only if you want to see it

只需相应选择fxfy(水平条纹设置为fy=0,垂直条纹设置为fx=0,斜条纹设置为fx,fy)。顺便说一句。条纹的周期(以像素为单位)正好是

period_in_pixel = 1 / sqrt(fx^2 + fy^2);

棋盘格式

f = 1 / 20; % 1 / period
Nx = 200;
Ny = 200;
[xi, yi] = ndgrid(1 : Nx, 1 : Ny);
mask = sin(2 * pi * f * xi) .* sin(2 * pi * f * yi) > 0; % for binary mask
mask = (sin(2 * pi * f * xi) .* sin(2 * pi * f * yi) + 1) / 2; % for more gradual mask
imagesc(mask);

这里每个x,y方向的黑色和白色方块的数量是:

number_squares_x = 2 * f * Nx
number_squares_y = 2 * f * Ny

如果您知道图像的大小和所需的方格数,则可以使用它来计算参数f。

将遮罩与图像相乘:

现在这很容易。掩码是逻辑的(白色=真,黑色=假)。现在你只需要决定你要保留哪个部分(白色或黑色部分)。

将图像与蒙版相乘

masked_image = original_image .* mask;

保持面具中的白色区域和

masked_image = original_image .* ~mask;

反之。

答案 1 :(得分:1)

这实际上是Trilarion答案的延伸,可以更好地控制条纹外观:

function out = diagStripes( outSize, stripeAngle, stripeDistance, stripeThickness )
stripeAngle = wrapTo2Pi(-stripeAngle+pi/2);
if (stripeAngle == pi/2) || (stripeAngle == 3*pi/2)
    f = @(fx, fy, xi, yi) cos(2 * pi * (fy * yi)); % vertical stripes
elseif (stripeAngle == 0)||(stripeAngle == pi)
    f = @(fx, fy, xi, yi) cos(2 * pi * (fx * xi)); % horizontal stripes
else
    f = @(fx, fy, xi, yi) cos(2 * pi * (fx * xi  + fy * yi)); % diagonal stripes
end
if numel(outSize) == 1
    outSize = [outSize outSize];
end;

fx = cos(stripeAngle) / stripeDistance; % period in x direction
fy = sin(stripeAngle) / stripeDistance; % period in y direction
Nx = outSize(2); % image dimension in x direction
Ny = outSize(1); % image dimension in y direction
[yi, xi] = ndgrid((1 : Ny)-Ny/2, (1 : Nx)-Nx/2);
mask = (f(fx, fy, xi, yi)+1)/2; % for gradual [0,1] mask
out = mask < (cos(pi*stripeThickness)+1)/2; % for binary mask
end

outSize是两个或一个元素向量,以像素为单位给出输出图像的尺寸,stripeAngle给出以弧度为单位的条纹斜率,stripeDistance是条纹中心之间的距离以像素为单位,stripeDistance[0 .. 1]中的浮点值,它给出(白色)背景中(黑色)条纹的覆盖率。

还有other question的答案,用于生成自定义的棋盘格模式。