2015-12-02 79 views
0

基于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); 
+1

在Stackoverflow上,你需要首先发布一些代码,显示你已经试图让你自己工作。然后发布具体的编码错误。关于它为什么起作用的理论,你最好还是要求[dsp.se] – Dan

回答

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; 

的对面。

+0

等待,对不起,有没有办法将输出与我的矩阵* mInputImage *相乘? –

+0

我似乎已经乘以我的旧工作区变量,所以它仍然工作。 –

+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 

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

也有对other question生成自定义棋盘图案的答案。