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

%這個腳本的作用:
%       通過鼠標取圖像中的兩點,連線
%	繪製連線的像素灰度值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章