在 MATLAB 中更改一行上的像素值

Change pixel values on a line in MATLAB

我希望在其端点由霍夫变换返回为零的直线上设置值。我写了下面的代码片段

imshow(img); 
hold on
img_black = img;

for k = 1:length(lines)

    xy = [lines(k).point1; lines(k).point2];  %line end points
    [x, y] = bresenham(xy(1,1),xy(1,2),xy(2,1),xy(2,2));   %returns all points on the line

    for i = 1:length(x)
        plot(x(i),y(i),'*');   %to plot individual pixels on line itself
        img_black(x(i),y(i),:) = [0,0,0];    %set rgb values to zero
    end   
end

虽然下图中绘制的点符合预期

相应像素值被设置为零的图像不符合预期。

这里发生了什么?

您似乎混淆了 xy 的行和列。

img_black(x(i), y(i),:)

应该是

img_black(y(i), x(i),:);

这是因为 img_black 的第一个维度是行 (y),第二个维度是列 (x)。

生成的图像看起来确实如此,因为您的线条走错了方向并且(有时)超出了原始图像的范围,但是 MATLAB 很乐意扩展您的图像(使用零)并设置您请求的值,因此右边的所有黑色像素。

NOTE: This switching back and forth between row, column and x,y is common throughout MATLAB's built-in functions and you should always be careful to note what the output is. A class example is meshgrid vs ndgrid outputs.