根据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);
答案 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
只需相应选择fx
和fy
(水平条纹设置为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的答案,用于生成自定义的棋盘格模式。