3

こんにちは、私はデジタル画像処理の初心者です。標準的なアルゴリズムがあることを知りたいだけですか? これは、入力 RGB イメージを目的のサイズのサブイメージに分割し、これらのサブイメージを組み合わせて元のイメージを形成します。

4

3 に答える 3

3
% Demo to divide a color image up into blocks.
clc;    % Clear the command window.
close all;  % Close all figures (except those of imtool.)
workspace;  % Make sure the workspace panel is showing.
fontSize = 20;

% Read in a standard MATLAB color demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'peppers.png';
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
    % Didn't find it there.  Check the search path for it.
    fullFileName = baseFileName; % No path this time.
    if ~exist(fullFileName, 'file')
        % Still didn't find it.  Alert user.
        errorMessage = sprintf('Error: %s does not exist.', fullFileName);
        uiwait(warndlg(errorMessage));
        return;
    end
end
% Read the image from disk.
rgbImage = imread(fullFileName);

% Test code if you want to try it with a gray scale image.
% Uncomment line below if you want to see how it works with a gray scale image.
% rgbImage = rgb2gray(rgbImage);

% Display image full screen.
imshow(rgbImage);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);
drawnow;
% Get the dimensions of the image.  numberOfColorBands should be = 3.
[rows columns numberOfColorBands] = size(rgbImage)

%==========================================================================
% The first way to divide an image up into blocks is by using mat2cell().
blockSizeR = 150; % Rows in block.
blockSizeC = 100; % Columns in block.

% Figure out the size of each block in rows. 
% Most will be blockSizeR but there may be a remainder amount of less than that.
wholeBlockRows = floor(rows / blockSizeR);
blockVectorR = [blockSizeR * ones(1, wholeBlockRows), rem(rows, blockSizeR)];
% Figure out the size of each block in columns. 
wholeBlockCols = floor(columns / blockSizeC);
blockVectorC = [blockSizeC * ones(1, wholeBlockCols), rem(columns, blockSizeC)];

% Create the cell array, ca.  
% Each cell (except for the remainder cells at the end of the image)
% in the array contains a blockSizeR by blockSizeC by 3 color array.
% This line is where the image is actually divided up into blocks.
if numberOfColorBands > 1
    % It's a color image.
    ca = mat2cell(rgbImage, blockVectorR, blockVectorC, numberOfColorBands);
else
    ca = mat2cell(rgbImage, blockVectorR, blockVectorC);
end

% Now display all the blocks.
plotIndex = 1;
numPlotsR = size(ca, 1);
numPlotsC = size(ca, 2);
for r = 1 : numPlotsR
    for c = 1 : numPlotsC
        fprintf('plotindex = %d,   c=%d, r=%d\n', plotIndex, c, r);
        % Specify the location for display of the image.
        subplot(numPlotsR, numPlotsC, plotIndex);
        % Extract the numerical array out of the cell
        % just for tutorial purposes.
        rgbBlock = ca{r,c};
        imshow(rgbBlock); % Could call imshow(ca{r,c}) if you wanted to.
        [rowsB columnsB numberOfColorBandsB] = size(rgbBlock);
        % Make the caption the block number.
        caption = sprintf('Block #%d of %d\n%d rows by %d columns', ...
            plotIndex, numPlotsR*numPlotsC, rowsB, columnsB);
        title(caption);
        drawnow;
        % Increment the subplot to the next location.
        plotIndex = plotIndex + 1;
    end
end

% Display the original image in the upper left.
subplot(4, 6, 1);
imshow(rgbImage);
title('Original Image');

%==============================================================================
% Another way to split the image up into blocks is to use indexing.
% Read in a standard MATLAB gray scale demo image.
folder = fullfile(matlabroot, '\toolbox\images\imdemos');
baseFileName = 'cameraman.tif';
fullFileName = fullfile(folder, baseFileName);
% Get the full filename, with path prepended.
fullFileName = fullfile(folder, baseFileName);
if ~exist(fullFileName, 'file')
    % Didn't find it there.  Check the search path for it.
    fullFileName = baseFileName; % No path this time.
    if ~exist(fullFileName, 'file')
        % Still didn't find it.  Alert user.
        errorMessage = sprintf('Error: %s does not exist.', fullFileName);
        uiwait(warndlg(errorMessage));
        return;
    end
end
grayImage = imread(fullFileName);
% Get the dimensions of the image.  numberOfColorBands should be = 1.
[rows columns numberOfColorBands] = size(grayImage);
% Display the original gray scale image.
figure;
subplot(2, 2, 1);
imshow(grayImage, []);
title('Original Grayscale Image', 'FontSize', fontSize);
% Enlarge figure to full screen.
set(gcf, 'units','normalized','outerposition',[0 0 1 1]);

% Divide the image up into 4 blocks.
% Let's assume we know the block size and that all blocks will be the same size.
blockSizeR = 128; % Rows in block.
blockSizeC = 128; % Columns in block.
% Figure out the size of each block. 
wholeBlockRows = floor(rows / blockSizeR);
wholeBlockCols = floor(columns / blockSizeC);
% Preallocate a 3D image
image3d = zeros(wholeBlockRows, wholeBlockCols, 3);
% Now scan though, getting each block and putting it as a slice of a 3D array.
sliceNumber = 1;
for row = 1 : blockSizeR : rows
    for col = 1 : blockSizeR : columns
        % Let's be a little explicit here in our variables
        % to make it easier to see what's going on.
        row1 = row;
        row2 = row1 + blockSizeR - 1;
        col1 = col;
        col2 = col1 + blockSizeC - 1;
        % Extract out the block into a single subimage.
        oneBlock = grayImage(row1:row2, col1:col2);
        % Specify the location for display of the image.
        subplot(2, 2, sliceNumber);
        imshow(oneBlock);
        % Make the caption the block number.
        caption = sprintf('Block #%d of 4', sliceNumber);
        title(caption);
        drawnow;
        % Assign this slice to the image we just extracted.
        image3D(:, :, sliceNumber) = oneBlock;
        sliceNumber = sliceNumber + 1;
    end
end
% Now image3D is a 3D image where each slice, 
% or plane, is one quadrant of the original 2D image.

msgbox('Done with demo!  Check out the two figures.');

また、この投稿のアルゴリズムを見て、画像をより小さな画像に分割して、空白の量を減らし、長方形の最大量を指定することができます

于 2013-01-17T06:08:56.540 に答える
3

MATLAB には、 という関数が用意されていますblockproc。あなたの場合、入力画像を使用すると、定義した関数はどこにあるIと言うでしょう。http://www.mathworks.com/help/images/ref/blockproc.htmlに簡単な例が示されています。I2 = blockproc(I, [8, 8], @fun);fun

これは実際には、画像Iを特定のサイズ (8 x 8 など) のタイルに分割し、 で定義された特定の方法で各タイルを処理し、各タイルの結果からfun画像を再構築する場合にのみ使用されることに注意してください。I2

結果は単一の数値または行列のいずれかになりますが、 の使用blockprocは実際には、タイルに分割し、各タイルを処理し、結果を出力画像に再構成する場合に限定されます。しかし、それは非常に便利です。

于 2013-01-17T06:25:46.230 に答える
2

を使用reshapeしてそれを実現できます。たとえば、64x64 ピクセルの RGB 画像があるとします。

im=rand(64,64,3);

8x8の行列に分けましょう

ims=reshape(im,8,8,3,[]);
size(ims)
ans =
 8     8     3    64

そしてim=reshape(ims,64,64,[]);元のサイズに戻ります。

これは、画像を 64 のサブマトリックスに分割する大まかな例で、それぞれがその RGB コンポーネントを保持します。ほとんどの場合、必要なものはこの一般的な再形成を使用せず、代わりにローカルの近隣に何らかの機能を適用する必要があります。たとえば、またはmedfilt2(im,[8 8])image のローカル標準偏差を使用した 2-d メディアン ファイリング、または既に言及されているものなど...したがって、必要なものがわかるポイントに到達したら、より具体的な質問をしてください.. .stdfilt(im, [8 8])blockproc

于 2013-01-17T08:04:42.133 に答える