Matlab 如何创建对角线条纹图案和棋盘格图案?

Matlab 如何创建对角线条纹图案和棋盘格图案?,matlab,image-processing,matrix,textures,modulation,Matlab,Image Processing,Matrix,Textures,Modulation,基于这个问题,我可以确认水平模式可以施加到矩阵上(在本例中为图像),方法是将其与用以下方法创建的调制信号相乘: vModulationSignal = 1 + (0.5 * cos(2 * pi * (signalFreq / numRows) * [0:(numRows - 1)].')); 如果有人能解释一下上述调制信号的工作原理,那就太好了 现在我想创建对角线图案,例如: 和纵横交错(方格)的图案,例如: 使用类似的vModulationSignal 创建调制信号的代码摘录 我试图

基于这个问题,我可以确认水平模式可以施加到矩阵上(在本例中为图像),方法是将其与用以下方法创建的调制信号相乘:

vModulationSignal = 1 + (0.5 * cos(2 * pi * (signalFreq / numRows) * [0:(numRows - 1)].'));
如果有人能解释一下上述调制信号的工作原理,那就太好了

现在我想创建对角线图案,例如:

和纵横交错(方格)的图案,例如:

使用类似的vModulationSignal


创建调制信号的代码摘录

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


对于水平、垂直、对角线条纹

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
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);
只需选择相应的
fx
fy
(水平条纹设置
fy=0
,垂直条纹设置
fx=0
,对角线条纹设置
fx,fy
相等)。顺便说一句,条纹的周期(以像素为单位)是精确的

period_in_pixel = 1 / sqrt(fx^2 + fy^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
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;

相反

对于水平、垂直、对角线条纹

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
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);
只需选择相应的
fx
fy
(水平条纹设置
fy=0
,垂直条纹设置
fx=0
,对角线条纹设置
fx,fy
相等)。顺便说一句,条纹的周期(以像素为单位)是精确的

period_in_pixel = 1 / sqrt(fx^2 + fy^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
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;

相反

这实际上是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
function out=diagStripes(超大、条带角度、条带间距、条带厚度)
stripeAngle=wrapTo2Pi(-stripeAngle+pi/2);
如果(stripeAngle==pi/2)| |(stripeAngle==3*pi/2)
F= @(FX,FY,席,彝)COS(2×PI*(FY*YI));%垂直条纹
elseif(stripeAngle==0)| |(stripeAngle==pi)
F= @(FX,FY,席,彝)COS(2×PI*(Fx*席));%横条
其他的
F= @(FX,FY,席,彝)席斯(2×PI*(Fx*XI+FY* YI));%斜纹
结束
如果numel(超大)==1
特大号=[outSize-outSize];
结束;
fx=cos(条带角度)/stripedInstance;%x方向的周期
fy=sin(条纹角度)/stripedInstance;%y方向周期
Nx=超大(2);%x方向上的图像尺寸
Ny=超大(1);%y方向上的图像尺寸
[yi,xi]=ndgrid((1:Ny)-Ny/2,(1:Nx)-Nx/2);
掩码=(f(fx,fy,席,yi)+1)/2;%对于渐变[0,1]遮罩
out=遮罩<(cos(pi*条纹厚度)+1)/2;%二元掩模
结束
outSize
是以像素为单位给出输出图像尺寸的两个或一个元素向量,
stripeAngle
以弧度为单位给出条纹斜率,
stripeDistance
是以像素为单位的条纹中心之间的距离,
stripeDistance
[0..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
function out=diagStripes(超大、条带角度、条带间距、条带厚度)
stripeAngle=wrapTo2Pi(-stripeAngle+pi/2);
如果(stripeAngle==pi/2)| |(stripeAngle==3*pi/2)
F= @(FX,FY,席,彝)COS(2×PI*(FY*YI));%垂直条纹
elseif(stripeAngle==0)| |(stripeAngle==pi)
F= @(FX,FY,席,彝)COS(2×PI*(Fx*席));%横条
其他的
F= @(FX,FY,席,彝)席斯(2×PI*(Fx*XI+FY* YI));%斜纹
结束
如果numel(超大)==1
特大号=[outSize-outSize];
结束;
fx=cos(条带角度)/stripedInstance;%x方向的周期
fy=sin(条纹角度)/stripedInstance;%y方向周期
Nx=超大(2);%x方向上的图像尺寸
Ny=超大(1);%y方向上的图像尺寸
[yi,xi]=ndgrid((1:Ny)-Ny/2,(1:Nx)-Nx/2);
掩码=(f(fx,fy,席,yi)+1)/2;%对于渐变[0,1]遮罩
out=遮罩<(cos(pi*条纹厚度)+1)/2;%二元掩模
结束
outSize
是以像素为单位给出输出图像尺寸的两个或一个元素向量,
stripeAngle
以弧度为单位给出条纹斜率,
stripeDistance
是以像素为单位的条纹中心之间的距离,
stripeDistance
[0..1]中的浮点值
给出(白色)背景中(黑色)条纹的覆盖率


此外,还提供了生成自定义棋盘格图案的方法。

在Stackoverflow上,您需要首先发布一些代码,表明您已尝试自行实现此功能。然后公布你有哪些具体的编码错误。至于它为什么工作的理论,你最好在Stackoverflow上再问一下,你需要先发布一些代码,表明你已经尝试让它自己工作。然后公布你有哪些具体的编码错误。至于为什么呢