【问题标题】:How to create diagonal stripe patterns and checkerboard patterns?如何创建斜条纹图案和棋盘图案?
【发布时间】:2016-03-06 17:34:11
【问题描述】:

基于this 问题,我可以通过将其与由此创建的调制信号相乘来确认可以将水平图案施加到矩阵(在本例中为图像)上:

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

如果有人能解释为什么上述调制信号有效,那就太好了。

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

还有像这样的纵横交错(方格)图案:

使用类似的 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);

【问题讨论】:

  • 在 Stackoverflow 上,您需要先发布一些代码,表明您已尝试自行解决此问题。然后发布您有哪些具体的编码错误。至于它为什么起作用的理论,你最好在Signal Processing 上问这个

标签: matlab image-processing matrix textures modulation


【解决方案1】:

对于水平、垂直、斜条纹

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;

相反。

【讨论】:

  • 等等,对不起,有没有办法将输出与我的矩阵 mInputImage 相乘?
  • 我似乎一直在乘以我的旧工作区变量,所以它仍然有效。
  • @SharanDuggirala 我扩展了一点,并添加了关于乘以掩码的部分。现在我完成了。
  • @trillian,实际上我一直在寻找更多的透明覆盖,但无论如何都可以通过添加来实现 - 所以一切都很好
  • @SharanDuggirala 要是你能说出你想说的话就好了。无论如何,我可以使面具更透明(逐渐)。请查看我的(现在是最后一个)编辑。
【解决方案2】:

这实际上是 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 也有用于生成自定义棋盘模式的答案。

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2016-05-23
    • 2019-10-10
    相关资源
    最近更新 更多