2014-12-01 104 views
0

大家好,我试图在将图像分成N个不同的块,宽度为:将图像划分为N个块,并计算每个块的边缘点Matlab

Ioriginal = imread('sample.jpg') %read the image 
Igray = rgb2gray(Ioriginal) %change it to gray scale 
InoNoise = wiener2(Igray) %remove noise from image 
image = edge(InoNoise, 'prewitt') %get the edge points of the image 

的结果示于这样的画面: enter image description here

现在我想要做的是将图像划分为N个相等的块在宽度并计算每个块的边缘点

师后,图像应划分是这样的: enter image description here

我真的很感激,如果有人能真正帮我做这部分

谢谢

+0

你能上传原始图片吗?我希望能够重现您的结果。 – rayryeng 2014-12-01 21:36:02

+0

另外,你的意思是把图像分成“N”等块“的​​宽度”?你能否详细说明一下?我不明白这是什么意思。你是否希望每个块的**高度**保持一致(可能是图像的高度),并且您想要将图像分解为宽度方向的块?难道你不能简单地做一个边缘检测整体(这是你所做的),然后将图像分成块进行进一步分析?为什么要先将图像分成块,然后计算边缘?如果你使用Prewitt操作符,那么它不应该有所作为。 – rayryeng 2014-12-01 21:41:59

+0

@rayryeng我已经更新了这个问题,你可能会找到我想要如何分割图像的答案。 – Alladin 2014-12-01 21:49:33

回答

2

如果我正确理解你的问题,你想要将边缘检测图像分解成N块,其中每个块的高度是图像的高度,同时计算每个块的宽度,使得其宽度为m,其中N*m = width of image。因此,每个块的宽度是width of image/N。请记住,您必须选择一个值N,以便它可以被图像的宽度整除。你的图像有460列,所以我们可以选择任意数量的可被10整除的块......所以我们选择10块。

分解图像最简单的方法是使用mat2cell。这需要一个2D矩阵并将矩阵分割成几部分。每件作品将存储在单元阵列中的单个元素中。因此,您需要确保每个块的高度相同,并且每个块的宽度使用上面给出的公式。因此,你只需要这样做。我正在阅读直接从StackOverflow发布的示例图像,但图像实际上传为RGB。我将它转换,使我们得到一个实际的边缘图直接二进制:

N = 10; %// Declare total number of blocks 
im = im2bw(imread('http://i.stack.imgur.com/ZvfoL.png')); %// Read in image 
C = mat2cell(im, size(im,1), (size(im,2)/N)*ones(N,1)); 

C将包含图像块,其中C{idx}将让你位于指数idx图像块。如果你想成为一个三维阵列,其中每个给你你想要的图像块,只需使用cat并连接在第三维度,像这样的:

C_matrix = cat(3, C{:}); 

因此,在访问块idx,只需做C_matrix(:,:,idx)


作为视觉表现,让我们在数字显示每块:

figure; 
hold on; 
for idx = 1 : N 
    subplot(1,N,idx); 
    imshow(C{idx}); %// Or imshow(C_matrix(:,:,idx)); 
end 

这就是我得到:

enter image description here

基本上,每个块放置在窗户本身的一个单独的图中,这就是为什么我使用subplot。你可以看到块之间有一个白色的空白,它可以正确地显示图像中每个分离的块。


祝你好运!

+0

再一次,这正是我想要的非常感谢你 – Alladin 2014-12-01 22:28:03

+0

@Alladinsaoudi - 非常欢迎您,祝您工作愉快! – rayryeng 2014-12-01 22:28:57

+0

我不知道你可以从'imread'一个URL ... cool! – chappjc 2014-12-02 01:27:56