finding 4 neighbor of pixel in grayscale image.
3 次查看(过去 30 天)
显示 更早的评论
i am trying to find the 4 neighbor of pixel x0,y0 in grayscale image but i getting empty x,y . her is the code i am using
function [x,y]= neighbours(image,x0,y0,thres)
image=double(image);
interest = image(x0,y0);
pixel =zeros(size(image));
pixel(x0,y0)=1;
x=[];
y=[];
up= image(conv2(pixel,[0 1 0; 0 0 0; 0 0 0],'same')>0);
if abs(up- interest)<=thres
if isempty(up)~=1
x(1)=x0;
y(1)=y0-1;
end
end
down= image(conv2(pixel,[0 0 0; 0 0 0; 0 1 0],'same')>0);
if abs(down- interest)<=thres
if isempty(down)~=1
x(2)=x0;
y(2)=y0+1;
end
end
left= image(conv2(pixel,[0 0 0; 1 0 0; 0 0 0],'same')>0);
if abs(left- interest)<=thres
if isempty(left)~=1
x(3)=x0-1;
y(3)=y0;
end
end
right= image(conv2(pixel,[0 0 0; 0 0 1; 0 0 0],'same')>0);
if abs(right- interest)<=thres
if isempty(right)~=1
x(4)=x0+1;
y(4)=y0;
end
end
end
0 个评论
采纳的回答
DGM
2024-6-2
编辑:DGM
2024-6-2
Disregarding edges, the 4-neighbors of a pixel IM(y,x) are obviously
%IM(y,x+[-1 1]) % horizontally-adjacent pair
%IM(y+[-1 1],x) % vertically-adjacent pair
... but your code is doing a bunch of unrelated and apparently redundant things, so if you're not asking for the obvious answer, what are you actually asking?
It's fairly clear that x0 and y0 are expected to be scalars, based on the use of subscript indexing, so why is it necessary to perform four convolutions of the entire image instead of doing rudimentary addressing of the array?
Assuming that you expect the output to be fixed length, then:
% inputs
inpict = imread('cameraman.tif');
x0 = 128;
y0 = 128;
threshold = 128;
[x y] = neighbours(inpict,x0,y0,threshold)
function [xs,ys] = neighbours(inpict,x0,y0,threshold)
% blah blah blah write a synopsis here
%
% INPICT is expected to be single-channel
% X0,Y0 must be scalar integers
% THRESHOLD must be scaled appropriate for the class of INPICT
%
% Outputs are fixed-length subscript vectors corresponding to the
% [N; S; E; W] neighbors of INPICT(X0,Y0). Neighbors which are
% outside the image page geometry or have an absolute intensity
% difference greater than THRESHOLD are filled with NaN.
% these must be integers
x0 = round(x0);
y0 = round(y0);
% check inputs
sz = size(inpict,1:3);
if sz(3) ~= 1
error('expected INPICT to be a single-channel image')
end
if x0 < 1 || x0 > sz(2)
error('X0 must lie within the image geometry')
end
if y0 < 1 || y0 > sz(1)
error('Y0 must lie within the image geometry')
end
if ~isscalar(x0) || ~isscalar(y0)
error('X0 and Y0 must be scalars')
end
% expand to candidate sample positions
xs = [x0; x0; x0 + [1; -1]]; % [N; S; E; W]
ys = [y0 + [1; -1]; y0; y0];
% map valid candidates
validss = ys >= 1 & ys <= sz(1) & xs >= 1 & xs <= sz(2);
% build index list
idx = sub2ind(sz(1:2),ys(validss),xs(validss));
% find neighbors which are similar in intensity
dI = double(inpict(idx)) - double(inpict(y0,x0));
similarintensity = abs(dI) < threshold;
% combine the two masks
% this is the map of valid subscripts which have a similar pixel intensity
validss(validss) = validss(validss) & similarintensity;
% replace invalid coordinates with NaN?
xs(~validss) = NaN;
ys(~validss) = NaN;
end
My guess is that you were ignoring the scale of your input image when you selected your threshold value.
0 个评论
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Image Segmentation and Analysis 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!