2015-12-02 82 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生成自定義棋盤圖案的答案。