Matlab 在灰度图像上为河流着色

Matlab 在灰度图像上为河流着色,matlab,image-processing,Matlab,Image Processing,试图把一条河从黑色漆成黄色,我遇到了一个“小”问题 在这个问题上给出的图像是一张地图的简单灰度图像,上面有一条河()。 任务是将这条河从黑色(0,0,0)漆成黄色(255255,0) 据我所知,如果不将灰度图像“转换”为RGB,我们实际上无法绘制灰度图像,因此我所做的是: 得到了图像 使用imread()来“读取”图像 使用函数cat连接我的图像(显然“变成”RGB图像?) 循环检查图像的每个部分,并检查哪些部分的值在0到48之间(根据我所读到的内容,有不同的黑色阴影,显然是从8到8,比如(0,

试图把一条河从黑色漆成黄色,我遇到了一个“小”问题

在这个问题上给出的图像是一张地图的简单灰度图像,上面有一条河()。 任务是将这条河从黑色(0,0,0)漆成黄色(255255,0)

据我所知,如果不将灰度图像“转换”为RGB,我们实际上无法绘制灰度图像,因此我所做的是:

  • 得到了图像
  • 使用imread()来“读取”图像
  • 使用函数cat连接我的图像(显然“变成”RGB图像?)
  • 循环检查图像的每个部分,并检查哪些部分的值在0到48之间(根据我所读到的内容,有不同的黑色阴影,显然是从8到8,比如(0,0,0),(8,8,8)等等)
  • 如果该范围内有一个值,我会将其涂成黄色(255255,0)
  • 问题在于,这条河不仅被漆成了黄色,而且在图像的右侧还添加了一个相对较大的黄色正方形。我将在代码之后立即发布图像

    originalIM_River = imread('fig_lista4_2.bmp');
    figure,title('Original image'),imshow(originalIM_River)
    
    imRGB_River = cat(3, originalIM_River, originalIM_River, originalIM_River);
    [nLine, nColumn] = size(imRGB_River);
    
    for i = 1 : nLine
        for j = 1 : nColumn
            if imRGB_River(i,j) >= 0 && imRGB_River(i,j) <= 48
                imRGB_River(i,j,:) = [255,255,0]; % (255,255,0) is yellow
            end
        end
    end
    
    figure, title('New imagem - River painted with yellow'),imshow(imRGB_River)
    
    originalIM_River=imread('fig_lista4_2.bmp');
    图,标题(“原始图像”),imshow(原始阿利姆河)
    imRGB_河=cat(3,originalIM_河,originalIM_河,originalIM_河);
    [nLine,N柱]=尺寸(imRGB_河);
    对于i=1:nLine
    对于j=1:n列
    
    如果imRGB_河(i,j)>=0&&imRGB_河(i,j)则错误在于此行:

    [nLine, nColumn] = size(imRGB_River);
    
    这里,
    imRGB_River
    是一个三维矩阵,3是第三维的大小。由于您只从函数中请求2个维度,它将返回上一次输出中所有非单例尾随维度的乘积,因此
    nColumn
    将返回为
    N*3
    ,或比您预期的大三倍。要修复它,您可以使用原始图像矩阵(在复制第三维之前):

    或按如下方式调用
    size


    错误在于这一行:

    [nLine, nColumn] = size(imRGB_River);
    
    这里,
    imRGB_River
    是一个三维矩阵,3是第三维的大小。由于您只从函数中请求2个维度,它将返回上一次输出中所有非单例尾随维度的乘积,因此
    nColumn
    将返回为
    N*3
    ,或比您预期的大三倍。要修复它,您可以使用原始图像矩阵(在复制第三维之前):

    或按如下方式调用
    size


    我对Matlab一无所知,但我猜你在
    cat
    ed两个额外通道时创建了一个3倍于原始宽度的图像。我的意思是,你的图像在像素方面变得更宽,而不是在通道方面变得更深。我检查了MatLab窗口的左侧,注意到它从1024x1026变为1024x2591x3,试图找出解决方法。我猜您的原始图像已经是RGB,而不是单通道。因此,您可能需要使用一个带有原始Alim_River(:,:,1)
    的单一通道,或者强制
    imread()
    以灰度加载。我对Matlab一无所知,但我猜您在
    cat
    加载两个额外通道时创建了一个3倍于原始宽度的图像。我的意思是,你的图像在像素方面变得更宽,而不是在通道方面变得更深。我检查了MatLab窗口的左侧,注意到它从1024x1026变为1024x2591x3,试图找出解决方法。我猜您的原始图像已经是RGB,而不是单通道。因此,您可能只需要使用带有
    原始Alim_River(:,:,1)
    的单个通道,或者强制
    imread()
    以灰度加载。
    [nLine, nColumn, ~] = size(imRGB_River);