رفتن به مطلب

پست های پیشنهاد شده

سلام.یک تصویر 177در 144داریم که میخواهیم تبدیل ب چن تا بلوک کنم و بجای اینک از کل تصویر بگیریم از بلوک های تصویر بگیریم.چطور میتونم این کار را در متلب انجام بدم؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
سلام.یک تصویر 177در 144داریم که میخواهیم تبدیل ب چن تا بلوک کنم و بجای اینک از کل تصویر بگیریم از بلوک های تصویر بگیریم.چطور میتونم این کار را در متلب انجام بدم؟

 

سلام

ببخشید، سوالتو تازه دیدم، بیشتر توضیح میدی که می خوای چجوری بلوک بندیش کنی، یه لینک هم میذارم فکر کنم مفید باشه:

محتوای مخفی

    برای مشاهده محتوای مخفی می بایست در انجمن ثبت نام کنید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

ممنونم از توجهتون

نمیدونم این کدو از کدوم سایت گرفتم ولی کارمو راه انداخت

 

clc

clear

Image = imread('pp.jpg') ;

Image=rgb2gray(Image);

[r , c]=size(Image) ;

for i = 1 : ( r - mod(size(Image,1),8) )

for j = 1 : ( c - mod(size(Image,2),8) )

I(i,j) = Image(i,j) ;
       
end
   
end

row    = size(I,1) / 8 ;

column = size(I,2) / 8 ;


for i = 1 : row
 
r(i) = 8 ;
   
end

for i = 1 : column

c(i) = 8 ;
   
end


I2cell = mat2cell(I,r,c) 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام

ببخشید این کدی که برای بلوک بندی(قطعه بندی) تصویر رنگی تو پست بالا گذاشته شده هر چی خوندمش نفهمیدم. میشه توضیحش بدید؟

من باید تصویر رو به 8 تا بلوک درشت و یکنواخت تقسیم کنم وبعدش رنگ های غالب رو بدست بیارم. نیاز خیلی فوری به پاسخش دارم.

لطفا راهنمائی کنید.

اگه شماره تماسی هم برای پاسخ به سوالات بفرمائید ممنون میشم. ز طریق سایت خیلی وقتگیره و منم وقتم کم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
سلام

ببخشید این کدی که برای بلوک بندی(قطعه بندی) تصویر رنگی تو پست بالا گذاشته شده هر چی خوندمش نفهمیدم. میشه توضیحش بدید؟

من باید تصویر رو به 8 تا بلوک درشت و یکنواخت تقسیم کنم وبعدش رنگ های غالب رو بدست بیارم. نیاز خیلی فوری به پاسخش دارم.

لطفا راهنمائی کنید.

اگه شماره تماسی هم برای پاسخ به سوالات بفرمائید ممنون میشم. ز طریق سایت خیلی وقتگیره و منم وقتم کم

 

چرا این لینکتون نمیشه بهش دسترسی داشت؟

 

سلام دوست عزيز

 

مي توني از فانكشن هاي خود متلب مثل blockproc، colfilt و يا nlfilter استفاده كني، همه شون توي هلپ متلب با مثال توضيح داده شدن و بسته به اينكه مي خواي چه نوع بلوك هايي داشته باشي، مي توني يكشون رو انتخاب كني.

 

متاسفانه اون لينك هم فيل تر شده، من كدش رو براتون ميذارم:

This demo code shows how to split an image into non-overlapping blocks or tiles:

% Demo to divide an image up into blocks (non-overlapping tiles).
% The first way to divide an image up into blocks is by using mat2cell().
% In this demo, I demonstrate that with a color image.
% Another way to split the image up into blocks is to use indexing.
% In this demo, I demonstrate that method with a grayscale image.

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');

% Inform user of next stage where we process a gray scale image.
promptMessage = sprintf('Now I will do the same for a gray scale image.');
titleBarCaption = 'Continue?';
button = questdlg(promptMessage, titleBarCaption, 'OK', 'Cancel', 'OK');
if strcmpi(button, 'Cancel')
   return;
end

%==============================================================================
% 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 : blockSizeC : columns
       % Let's be a little explicit here in our variables
       % to make it easier to see what's going on.
       % Determine starting and ending rows.
       row1 = row;
       row2 = row1 + blockSizeR - 1;
       row2 = min(rows, row2); % Don't let it go outside the image.
       % Determine starting and ending columns.
       col1 = col;
       col2 = col1 + blockSizeC - 1;
       col2 = min(columns, col2); % Don't let it go outside the image.
       % 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, 'FontSize', fontSize);
       drawnow;
       % Assign this slice to the image we just extracted.
       if (row2-row1+1) == blockSizeR && (col2-col1+1) == blockSizeC
           % Then the block size is the tile size,
           % so add a slice to our 3D image stack.
           image3D(:, :, sliceNumber) = oneBlock;
       else
           newTileSize = [(row2-row1+1), (col2-col1+1)];
           warningMessage = sprintf('Warning: this block size of %d rows and %d columns\ndoes not match the preset block size of %d rows and %d columns.\nIt will not be added to the 3D image stack.',...
               newTileSize(1), newTileSize(2), blockSizeR, blockSizeC);
           uiwait(warndlg(warningMessage));
       end
       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.');

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام وقت بخیر

من از دستور im2col برای بلوک بندی استفاده میکنم اما مشکلی که داره این دستور بلوک ها را با اوورلپ انتخاب میکنه. فکر کنم باید از دستور blockproc استفاده کنم که اوورلپ نداشته باشم اما نمیدونم fun رو چطوری تعریف کنم که مثل دستور im2col هر بلوک را بصورت یک ستون در خردجی بفرسته .

واقعا برام ضروریه ممنون میشم جوابم رو بدید .

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
سلام وقت بخیر

من از دستور im2col برای بلوک بندی استفاده میکنم اما مشکلی که داره این دستور بلوک ها را با اوورلپ انتخاب میکنه. فکر کنم باید از دستور blockproc استفاده کنم که اوورلپ نداشته باشم اما نمیدونم fun رو چطوری تعریف کنم که مثل دستور im2col هر بلوک را بصورت یک ستون در خردجی بفرسته .

واقعا برام ضروریه ممنون میشم جوابم رو بدید .

 

سلام دوست عزیز

اگه im2col جواب میده و فقط می خوای Overlap نداشته باشه، Distinc هم بهش بده، حالت دیفالتش رو Sliding هست:

 

>> A = rand(100,10);
>> B = im2col(A,[5,5]);
>> B = im2col(A,[5,5],'Distinc');

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

واقعا ممنونم ازتون

مشکلی که با distinct دارم موقع reshape کردنش هست

چون این دستور خودش صفر اضافه میکنه تا بتونه بلوک بندی را درست انجام بده

مثلا اگر تصویر من 56*56 باشه و سایز بلوک 6 باشه ، 4 تا ستون و ردیف صفر اضافه میکنه در ابتدا

 

حالا برای reshape کردن باید چکار کنم ؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
واقعا ممنونم ازتون

مشکلی که با distinct دارم موقع reshape کردنش هست

چون این دستور خودش صفر اضافه میکنه تا بتونه بلوک بندی را درست انجام بده

مثلا اگر تصویر من 56*56 باشه و سایز بلوک 6 باشه ، 4 تا ستون و ردیف صفر اضافه میکنه در ابتدا

 

حالا برای reshape کردن باید چکار کنم ؟

 

آره خب، چون توی یه ماتریس می خواد بریزه، نمیشه چند تا ستون تعداد درایه های کمتری داشته باشن. Reshape واسه ی چی؟

برای بلوکبندی تصویر یا ماتریس میشه از mat2cell هم استفاده کرد، هر بلوک رو توی یه سلول یه آرایه می ریزه.

 

دقیقا چه خروجی ای می خوای بهت بده؟ بیشتر توضیح میدی؟

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

سلام مجدد

من باید تصویر را بلوک بندی کنم و روی هر بلوک یک سری عملیات پردازشی انجام بدم و دوباره به تصویر تبدیلش کنم

تا الان این کار را با دستور im2col انجام میدادم. اما الان نمیخوام overlap داشته باشم

وقتی sliding باشه مشکلی با reshape کردن ندارم اما برای distinct نمیشه

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
سلام مجدد

من باید تصویر را بلوک بندی کنم و روی هر بلوک یک سری عملیات پردازشی انجام بدم و دوباره به تصویر تبدیلش کنم

تا الان این کار را با دستور im2col انجام میدادم. اما الان نمیخوام overlap داشته باشم

وقتی sliding باشه مشکلی با reshape کردن ندارم اما برای distinct نمیشه

 

سلام

خب یا باید از blockproc استفاده کنی یا اینکه همین mat2cell که گفتم، دومی فکر کنم استفاده ازش واست ساده تر باشه، البته blockproc هم باید بشه استفاده کرد:

 

clear;
img = imread('peppers.png');
% 50 * 80 blocks

MyBlocks = mat2cell(img,[50*ones(1,floor(size(img,1)/50)) size(img,1)-50*floor(size(img,1)/50)],...
                       [80*ones(1,floor(size(img,2)/80)) size(img,2)-80*floor(size(img,2)/80)],...
                       size(img,3));
figure;
% Maximize figure size
set(gcf,'Position',get(0,'ScreenSize'))

n = 1;
%Show blocks
for rows = 1:size(MyBlocks,1)
   for cols = 1:size(MyBlocks,2)
       subplot(size(MyBlocks,1), size(MyBlocks,2),n)
       imshow(MyBlocks{rows,cols});
       n = n + 1;
   end
end

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • جدید...