像素上的十字绣图案

时间:2014-12-02 18:26:41

标签: image matlab image-processing

相关:Cross Stitch to Matlab

如何在像素化图像上创建交叉针迹图案?

类似的东西:

enter image description here

其中每个像素顶部都有一个类似X的图案。

1 个答案:

答案 0 :(得分:1)

这是我尝试在MATLAB中创建交叉拼接图像的尝试。我所看到的一种技术是对图像进行傅里叶变换,并以非常大的幅度战略性地替换光谱中的位置。理查德·艾伦·彼得斯二世(Richard Alan Peters II)在他的频域讨论中通过一张精彩的图像处理幻灯片展示了这背后的直觉。我附上下面的图片,您可以参考original slides here on page 50

enter image description here

基本上,如果你在光谱上放置一个单点(或者它应该是实际对,因为这是复平面,因此我们应该有共轭对),它定义了空间频率以及强度振荡的角度在。请记住,这是针对只有一点的频谱。如果要模仿十字绣图案,则需要在DC组件(中心)周围放置四个点。你想把它们放在北,南,东和西方向。这背后的直觉是,通过相对于中心水平放置两个点,我们将获得从左到右振荡的空间振荡。同样,如果我们相对于中心垂直放置两个点,我们会从上到下产生振荡。通过组合这两个,我们将模拟棋盘图案。

以下是我创建512 x 512图像的示例,并且在距离中心20像素的网格中放置了高幅度:

A = zeros(512, 512);
r = 20;
rows_half = floor(size(A,1)/2) + 1;
cols_half = floor(size(A,2)/2) + 1;
A(rows_half-r,cols_half) = 1000;
A(rows_half,cols_half-r) = 1000;
A(rows_half+r,cols_half) = 1000;
A(rows_half,cols_half+r) = 1000;
Ashift = ifftshift(A);
out = real(ifft2(Ashift));
imshow(out, []);

这是我得到的图像:

enter image description here

好吧,好吧?现在,您可能希望在正方形之间建立更紧密的间距,这意味着您需要使频率更大。因此,您只需更改每个点相对于中心的距离,因此可能将此值增加到40?将r设置为40,我们得到:

enter image description here

.... r = 80

enter image description here

好多了!此演示的要点是,您需要距离中心的距离足够大,以便模仿您在示例中看到的棋盘图案。

现在,我们需要拍摄并将其叠加到原始图像上。由于图像将具有各种不同的空间频率,因此您需要确保在图像的光谱中,使这些位置显着较大,以使其超过图像中的其他光谱。执行此操作时,您将能够恢复图像,但您会在图像上看到这些空间频率交错。所以,您需要做的就是将我们在上面所做的相同技术应用到我们的图像中。请注意,您将不得不使用距中心(DC)设置光谱所需的距离,以及制作幅度所需的距离。它必须大于您在图像中看到的大多数幅度。我要提出的一个建议是将这些位置设置为DC值的幅度。这只是整个光谱的最大值,或者您也可以获得光谱的中心。我会告诉你当我们这样做时会发生什么。因此,我建议缩放这个最大值,以便您可以控制一个参数来夸大或削弱拼接图案。我将使用内置于MATLAB的cameraman.tif图像来说明我的示例。

不用多说,这里是代码:

clear all;
close all;

%// Read in image and cast to double
im = imread('cameraman.tif');
im_double = double(im);

%// Take the 2D FFT.  We need to sample by at least twice the image
%// dimensions to avoid aliasing.  Shift to the centre
A = fftshift(fft2(im_double, 2*size(im,1), 2*size(im,2)));

%// Set distance from the centre and maximum magnitude value at these
%points
r = 160;
magval = max(abs(A(:)));
scale = 0.4;

%// Get the centre of the padded spectrum
rows_half = floor(size(A,1)/2) + 1;
cols_half = floor(size(A,2)/2) + 1;

%// Set our cardinal directions
A(rows_half-r,cols_half) = scale*magval;
A(rows_half,cols_half-r) = scale*magval;
A(rows_half+r,cols_half) = scale*magval;
A(rows_half,cols_half+r) = scale*magval;

%// Shift back, inverse, take real component and crop
Ashift = ifftshift(A);
out = real(ifft2(Ashift));
out = out(1:size(im,1), 1:size(im,2));

%// Normalize between 0 and 1
out = (out - min(out(:))) / (max(out(:)) - min(out(:)));
imshow(out);

管道通常与我们之前的管道相同。我们读入图像,转换为double以确保最佳精度,采用2D FFT,然后调用fftshift移动光谱,使DC分量位于中心。请记住,我执行2D FFT,使其两倍我们的图像尺寸。原因是因为这是避免锯齿所需的最小尺寸(回想一下Nyquist theorem)。

然后我设置了距离中心的距离,然后我有一些代码可以提取光谱的DC分量大小,以及可以用来缩小或夸大拼接图案的比例因子。我得到光谱的中心坐标,将我们的高幅度分量放在基数方向上,用ifftshift向后移,采用逆二维FFT,仅提取real分量,然后归一化结果因此它介于0和1之间。您还需要确保裁剪结果,使其与原始图像的大小相同。请记住,我们将光谱的大小设置为原始图像的两倍,因此我们需要裁剪出不必要的信息并获得有意义的信息。

使用r = 160并使用0.4的比例运行代码以应用于光谱的最大幅度(位于我们的4个位置),这就是我得到的:

enter image description here

与原始图像比较:

enter image description here

如果我将比例设置为1.0,会发生什么:

enter image description here

因为4个位置的幅度成分与图像的整体对比度一样强,所以您会看到针迹图案或多或少地模仿整体对比度以及图像的比例为1.0。这就是为什么在决定在光谱中设置这些位置之前,您想要缩小DC分量的大小。

这需要一些试验和错误,特别是如果你正在处理不同的图像,但这是你可以开始的。

对于彩色图像,您只需将每个颜色平面拆分为单独的图像,对每个图像执行该过程,然后在完成后重建每个平面。


玩得开心!