Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 如何在matlab中对图像的单个像素应用高斯滤波器?_Image_Matlab_Filter_Pixel_Gaussian - Fatal编程技术网

Image 如何在matlab中对图像的单个像素应用高斯滤波器?

Image 如何在matlab中对图像的单个像素应用高斯滤波器?,image,matlab,filter,pixel,gaussian,Image,Matlab,Filter,Pixel,Gaussian,我有一张黑白照片。我想将高斯滤波器应用于这张图像上的白色像素。然而,我想逐像素应用它,因为我想给不同的像素提供不同的高斯带宽参数 例如,图像上只有2个像素为白色,其他像素为黑色。我想对这两个像素应用不同的高斯滤波器。假设X[2]和Y[2]是两个像素的坐标 Gaussian bandwidth for X[0] and Y[0] is [10, 10], standard deviation is 1. Gaussian bandwidth for X[1] and Y[1] is [20, 20

我有一张黑白照片。我想将高斯滤波器应用于这张图像上的白色像素。然而,我想逐像素应用它,因为我想给不同的像素提供不同的高斯带宽参数

例如,图像上只有2个像素为白色,其他像素为黑色。我想对这两个像素应用不同的高斯滤波器。假设X[2]和Y[2]是两个像素的坐标

Gaussian bandwidth for X[0] and Y[0] is [10, 10], standard deviation is 1.
Gaussian bandwidth for X[1] and Y[1] is [20, 20], standard deviation is 3.
我知道roifilt2可以处理ROI,但它似乎只适用于图像的一个区域,而不是一个像素。在检查ROI处理后,我根据自己的理解编写了代码,但下面的代码给了我错误:

Error using imwrite (line 422)
Image data can not be empty.

Error in guassianFilter (line 73)
    imwrite(out,[outdir,imname,'.png'],'png');
过滤后的输出图像似乎为空。但我对matlab是新手,我不知道为什么会发生这种情况,以及如何修复它(

有没有我可以直接调用的matlab函数来完成这项工作

代码:


在概述一个可行的想法之前,让我先观察一下您发布的代码的一个问题。查看您对
roifilt2
的调用,您会发现
out
会被从文件中读取的每个单像素指令的结果覆盖。即使您发现了导致结果图像为空的其他错误,结果也会被覆盖不会是合成的

这个怎么样。你可以先从文件中读取所有像素位置和相应的带宽,然后仅从这些坐标以两个笔划重建过滤后的图像。读取像素列表可能如下所示

fid = fopen('points.txt');
pxl = struct('x', {}, 'y', {}, 'sig', {});
n_pxl = 0;
tline = fgets(fid);
while ischar(tline)
    line = regexp(tline,' ','split');
    n_pxl = n_pxl + 1;
    pxl(n_pxl).x = floor(str2double(line{1,3}));
    pxl(n_pxl).y = floor(str2double(line{1,4}));
    if strcmp(line{1},'touch') == 1
        pxl(n_pxl).sig = 1;
    elseif strcmp(line{1},'dT') == 1
        pxl(n_pxl).sig = 3;
    else
        pxl(n_pxl).sig = nan;
    end
    tline = fgets(fid);
end
fclose(fid);
其中
x
y
是位置,
sig
是带宽。假设
WIDTH
HEIGHT
是图像的尺寸,可以将合成结果图像初始化为平坦
out=0(高度、宽度)
。过滤器大小的查找向量可以是
flt_size=[10,15,20];
。在一些
中,对于
-loop-over
sig=[1,3]
,我们在收集与特定sigma对应的所有像素后,创建覆盖的每个“幻灯片”

im_raw = zeros(HEIGHT, WIDTH);
for k = find([pxl.sig] == sig)
    im_raw(pxl(k).y, pxl(k).x) = 1;
end
并根据过滤操作的结果增加合成值

fsz = flt_size(sig);
out = out + conv2(im_raw, fspecial('gaussian', [fsz, fsz], sig), 'same');
综上所述,循环可能是这样的:

out = zeros(HEIGHT, WIDTH);
flt_size = [10, 15, 20];
for sig = [1, 3]
    im_raw = zeros(HEIGHT, WIDTH);
    for k = find([pxl.sig] == sig)
        im_raw(pxl(k).y, pxl(k).x) = 1;
    end
    fsz = flt_size(sig); 
    out = out + conv2(im_raw, fspecial('gaussian', [fsz, fsz], sig), 'same');
end
使用稍大的带宽进行说明,这里是一个示例,用于每个类别中的两个点。左边和中间的图像显示每个“幻灯片”,右边的图像显示合成。每个图像按
imagesc
缩放


在概述一个可行的想法之前,让我先观察一下您发布的代码中的一个问题。查看您对
roifilt2
的调用,您会发现
out
会被您从文件中读取的每个单像素指令的结果覆盖。即使您发现了导致结果图像为空的其他错误,但结果永远不会是合成的

这个怎么样。你可以先从文件中读取所有像素位置和相应的带宽,然后仅从这些坐标以两个笔划重建过滤后的图像。读取像素列表可能如下所示

fid = fopen('points.txt');
pxl = struct('x', {}, 'y', {}, 'sig', {});
n_pxl = 0;
tline = fgets(fid);
while ischar(tline)
    line = regexp(tline,' ','split');
    n_pxl = n_pxl + 1;
    pxl(n_pxl).x = floor(str2double(line{1,3}));
    pxl(n_pxl).y = floor(str2double(line{1,4}));
    if strcmp(line{1},'touch') == 1
        pxl(n_pxl).sig = 1;
    elseif strcmp(line{1},'dT') == 1
        pxl(n_pxl).sig = 3;
    else
        pxl(n_pxl).sig = nan;
    end
    tline = fgets(fid);
end
fclose(fid);
其中
x
y
是位置,
sig
是带宽。假设
WIDTH
HEIGHT
是图像的尺寸,可以将合成结果图像初始化为平坦
out=0(高度、宽度)
。过滤器大小的查找向量可以是
flt_size=[10,15,20];
。在一些
中,对于
-loop-over
sig=[1,3]
,我们在收集与特定sigma对应的所有像素后,创建覆盖的每个“幻灯片”

im_raw = zeros(HEIGHT, WIDTH);
for k = find([pxl.sig] == sig)
    im_raw(pxl(k).y, pxl(k).x) = 1;
end
并根据过滤操作的结果增加合成值

fsz = flt_size(sig);
out = out + conv2(im_raw, fspecial('gaussian', [fsz, fsz], sig), 'same');
综上所述,循环可能是这样的:

out = zeros(HEIGHT, WIDTH);
flt_size = [10, 15, 20];
for sig = [1, 3]
    im_raw = zeros(HEIGHT, WIDTH);
    for k = find([pxl.sig] == sig)
        im_raw(pxl(k).y, pxl(k).x) = 1;
    end
    fsz = flt_size(sig); 
    out = out + conv2(im_raw, fspecial('gaussian', [fsz, fsz], sig), 'same');
end
使用稍大的带宽进行说明,这里是一个示例,用于每个类别中的两个点。左边和中间的图像显示每个“幻灯片”,右边的图像显示合成。每个图像按
imagesc
缩放


非常感谢你的班达拉!!我感谢你花时间和精力把它说清楚。非常感谢你的班达拉!!我感谢你花时间和精力把它说清楚。