Algorithm MATLAB圆形滑动窗口和像素值的直径提取

Algorithm MATLAB圆形滑动窗口和像素值的直径提取,algorithm,matlab,image-processing,sliding-window,Algorithm,Matlab,Image Processing,Sliding Window,我正在尝试实现一个算法,它需要一个圆形滑动窗口,它穿过图像的所有像素,对于每个窗口,我只需要提取位于圆的不同角度的直径上的像素 我试图用上面的图片更好地解释。假设这是一个圆形滑动窗口的结果,我只想得到红线上的像素值(pi/8的直径倾斜) 到目前为止,我写了以下几行代码: I= imread('lena.png'); I = im2double(I); h = fspecial('disk',5); h = h > 0; dir = pi/8; o_image = blockproc(I

我正在尝试实现一个算法,它需要一个圆形滑动窗口,它穿过图像的所有像素,对于每个窗口,我只需要提取位于圆的不同角度的直径上的像素

我试图用上面的图片更好地解释。假设这是一个圆形滑动窗口的结果,我只想得到红线上的像素值(pi/8的直径倾斜)

到目前为止,我写了以下几行代码:

I= imread('lena.png'); 
I = im2double(I);
h = fspecial('disk',5);
h = h > 0;
dir = pi/8;
o_image = blockproc(I, [1 1], @(x) MMF2D(x,h,dir), 'BorderSize', [5 5],...
'TrimBorder', false, 'PadPartialBlocks', true);
以及功能
MMF2D

function [ o_pixel ] = MMF2D( i_block, i_window, i_directions)
%MMF2D Summary of this function goes here
%   Detailed explanation goes here

new_block = i_block.data .* i_window;
但从这里开始,我不知道如何继续得到直径上的像素。直径可以倾斜任何角度。非常感谢您的帮助

以下是我要做的:

首先创建遮罩(如果需要,可以将其放入函数中),并获得相关像素索引作为角度的函数:

%% create mask and get indices as function of angle
o=5;
m=zeros(2*o+1);
m(o+1,:)=1;
theta=0:15:90; % in degrees, theres no need to go beyond 90 deg becuase of symmetry
for n=1:numel(theta)
   id{n}=find(imrotate(m,theta(n),'nearest','crop'));
end;
我使用单元格数组,因为每个角度可以有不同数量的索引

然后读取图像

I= imread('http://scipy-lectures.github.io/_images/lena.png'); 
将图像块重新排列为列

B = im2col(I,[2*o+1 2*o+1],'sliding');
你想要的只是:

for n=1:numel(theta)
    C{n} =  B(id{n},:);
end
C中的每个单元格元素表示图像中每个像素的直径
2*o+1
角度
theta
,角度
theta

所以
C{1}
将为您提供
theta=0
的所有像素,以及
theta=15
C{2}

转换到极坐标,然后只扫描角度和半径不是更简单吗?我没有线索,因此任何想法都可能比我的有趣、更简单、更好。你能把你的想法解释清楚一点吗?谢谢,让我理解你。你想让每一个像素都有一个由红线表示的遮罩上的像素值吗?谢谢!你解决了这个例子,但我意识到我没有用正确的方式解释这个问题。我需要每次能够得到单个直径上的像素,这个直径可以倾斜任何角度。我编辑了这个问题,试图更好地解释。也许你关于极坐标的第一个想法是正确的,但我不知道如何实现它。你希望输出是什么样子?