MATLAB图像处理与计算机视觉(2):在图像上取点划线

%本脚本的作用是:在图像中随机取两点,统计两点之间的像素,


clc;
clear all;

img = imread('F:\DataSet\retina Vessal\all\images\01_dr.jpg');
img = rgb2gray(img);
figure(1), imshow(img);
hold on;
%取点
[coordX, coordY] = ginput(2);
%连线
line([coordX(1) coordY(1)], [coordX(2) coordY(2)], 'Color', 'c');
%线的长度占多少个像素
linelength = ceil(sqrt((ceil(coordX(2)) - floor(coordX(1)))^2 + ...
            (ceil(coordY(2)) - floor(coordY(1)))^2));
%存储线的灰度值
linepts = zeros(linelength, 2);
idx1 = 1;
idx2 = 1;
for idxx = floor(coordX(1)):ceil(coordX(2))
    for idxy = floor(coordY(1)):ceil(coordY(2))
        linepts(idx1, idx2) = img(idxx, idxy);
        idx1 = idx1 + 1;
        idx2 = idx2 + 1;
    end
end

hold off;

怎么不能正确显示呢?

修改如下:

%本脚本的作用是:在图像中随机取两点,统计两点之间的像素,
%并将其灰度值绘制成一个曲线图(类似直方图)

clc;
clear all;

img = imread('F:\DataSet\retina Vessal\all\images\01_dr.jpg');
img = rgb2gray(img);
figure(1), imshow(img);
hold on;
%取点
[coordX, coordY] = ginput(2);
%连线
line(coordX, coordY, 'Color', 'c');
hold off;
%线的长度占多少个像素
linelength = ceil(sqrt((ceil(coordX(2)) - floor(coordX(1)))^2 + ...
            (ceil(coordY(2)) - floor(coordY(1)))^2));
%存储线的灰度值
linepts = zeros(linelength,1);
idx = 1;
%idx2 = 1;

if coordX(1)>= coordX(2) 
    stepx = -1;
    intfunX1 = 'ceil(coordX(1))';
    intfunX2 = 'floor(coordX(2))';
else
    stepx = 1;
    intfunX1 = 'floor(coordX(1))';
    intfunX2 = 'ceil(coordX(2))';
end

if coordY(1) >= coordY(2)
    stepy = -1;
    intfunY1 = 'ceil(coordY(1))';
    intfunY2 = 'floor(coordY(2))';
else
    stepy = 1;
    intfunY1 = 'floor(coordY(1))';
    intfunY2 = 'ceil(coordY(2))';
end


%{
%你知道为什么多出这么多像素吗?因为你将那个三角形区域全部计算在内了!
for idxx = eval(intfunX1) : stepx : eval(intfunX2)
    for idxy = eval(intfunY1) : stepy : eval(intfunY2)
        linepts(idx) = img(idxx, idxy);
        idx = idx + 1;        
    end
end

%line([1 1], [233
%hold off;
%}

if (coordX(2) - coordX(1)) ~= 0  && (coordY(2) - coordY(1)) ~= 0
    slopeS = (coordY(2) - coordY(1))/(coordX(2) - coordX(1));
    cutS = coordY(1) - slopeS * coordX(1);
    for idxx = eval(intfunX1) : stepx : eval(intfunX2)
        idxy = ceil(slopeS * idxx + cutS);
        linepts(idx) = img(idxx, idxy);
        idx = idx + 1;
    end
elseif  (coordX(2) - coordX(1)) == 0 
    for idxy = eval(intfunY1) : stepy : eval(intfunY2)
        idxx = ceil(coordX(2));
        linepts(idx) = img(idxx, idxy);
        idx = idx + 1;
    end
else
    for idxx = eval(intfunX1) : stepx : eval(intfunX2)
        idxy = ceil(coordY(2));
        linepts(idx) = img(idxx, idxy);
        idx = idx + 1;
    end
end

figure(2), plot(linepts);

%这个脚本的作用:
%       通过鼠标取图像中的两点,连线
%	绘制连线的像素灰度值


你可能感兴趣的:(matlab,图像处理)