Matlab 用像素值“填充剩余区域”;0“;

Matlab 用像素值“填充剩余区域”;0“;,matlab,Matlab,在下图中,我用两种不同的色调填充了两个区域: 如何在MATLAB中用像素值0(黑色)填充图像的剩余部分(未填充部分) 谢谢。尝试在两个灰色形状中拾取点,然后将其他所有的点都涂掉 img = imread(myimagefilename); imshow(img); % you can skip the following part and set clr1 and clr2 manually % if you already know the grayscale values in the

在下图中,我用两种不同的色调填充了两个区域:

如何在
MATLAB
中用像素值
0
(黑色)填充图像的剩余部分(未填充部分)


谢谢。

尝试在两个灰色形状中拾取点,然后将其他所有的点都涂掉

img = imread(myimagefilename);
imshow(img);

% you can skip the following part and set clr1 and clr2 manually 
% if you already know the grayscale values in the patches

pts=ginput(2);  % <-- pick points within the regions you colored in

clr1=img(pts(1,2),pts(1,1));
clr2=img(pts(2,2),pts(2,1));

img2=img;
img2(find(img~=clr1 & img~=clr2)) = 0;

img2=im2bw(img2,0.2);  % <-- 0.2 is the threshold

[xxx idx1]= bwfill(~img2,pts(1,1),pts(1,2),8);
[xxx idx2]= bwfill(~img2,pts(2,1),pts(2,2),8);
idx=setxor(union(idx1,idx2),[1:numel(img)]);

img2 = img;
img2(idx)=0;
imshow(img2)
img=imread(myimagefilename);
imshow(img);
%您可以跳过以下部分并手动设置clr1和clr2
%如果已经知道面片中的灰度值

pts=ginput(2);% 尝试在这两个灰色形状中拾取点,然后将其他所有点都涂成黑色

img = imread(myimagefilename);
imshow(img);

% you can skip the following part and set clr1 and clr2 manually 
% if you already know the grayscale values in the patches

pts=ginput(2);  % <-- pick points within the regions you colored in

clr1=img(pts(1,2),pts(1,1));
clr2=img(pts(2,2),pts(2,1));

img2=img;
img2(find(img~=clr1 & img~=clr2)) = 0;

img2=im2bw(img2,0.2);  % <-- 0.2 is the threshold

[xxx idx1]= bwfill(~img2,pts(1,1),pts(1,2),8);
[xxx idx2]= bwfill(~img2,pts(2,1),pts(2,2),8);
idx=setxor(union(idx1,idx2),[1:numel(img)]);

img2 = img;
img2(idx)=0;
imshow(img2)
img=imread(myimagefilename);
imshow(img);
%您可以跳过以下部分并手动设置clr1和clr2
%如果已经知道面片中的灰度值

pts=ginput(2);% 假设这两个区域的像素值的值被称为
val_1
val_2
,您可以这样做:

算法
  • 获取两个图像,一个图像的所有内容(除
    val_1
    设置为0外)都设置为0,另一个图像的
    val_2
    设置为0。这很可能也包含很多噪声点
  • 这两个图像具有适当阈值大小的遮罩。这将消除该值不在区域中的点
  • 结果图像的高区域与原始图像中连接的组件相对应
  • 根据需要更改相应图像中高区域的阴影,并添加它们以获得结果图像

  • 如果阴影事先不知道,您可以使用@TryHard的答案所示的
    ginput

    假设这两个区域的像素值的值被称为
    val_1
    val_2
    ,您可以这样做:

    算法
  • 获取两个图像,一个图像的所有内容(除
    val_1
    设置为0外)都设置为0,另一个图像的
    val_2
    设置为0。这很可能也包含很多噪声点
  • 这两个图像具有适当阈值大小的遮罩。这将消除该值不在区域中的点
  • 结果图像的高区域与原始图像中连接的组件相对应
  • 根据需要更改相应图像中高区域的阴影,并添加它们以获得结果图像

  • 如果事先不知道阴影,您可以使用
    ginput
    ,如@TryHard的回答所示。

    假设这是后续操作,当您获取roi时,您可以使用它来创建上面的图像,而不是或除了使用它之外,还可以使用它来创建黑色背景的图像。这避免了在图像中其他位置具有相同值的任何问题(归功于to对上一个问题的回答):

    或者,如果以后要再次使用,可以将区域存储为单个BW遮罩:

    imshow(img);
    
    % create masks
    roi = imfreehand(gca);
    BW = roi.createMask;
    roi2 = imfreehand(gca);
    BW2 = roi.createMask;
    
    % original image + roi
    img2 = img;
    img2(BW) = val_1;
    img2(BW2) = val_2;
    
    % B&W image 
    img3 = BW*val_1+BW2*val_2;
    

    假设这是一个后续步骤,当您获取roi时,除了使用它来创建上面的图像之外,您还可以使用它来创建具有黑色背景的图像。这避免了在图像中其他位置具有相同值的任何问题(归功于to对上一个问题的回答):

    或者,如果以后要再次使用,可以将区域存储为单个BW遮罩:

    imshow(img);
    
    % create masks
    roi = imfreehand(gca);
    BW = roi.createMask;
    roi2 = imfreehand(gca);
    BW2 = roi.createMask;
    
    % original image + roi
    img2 = img;
    img2(BW) = val_1;
    img2(BW2) = val_2;
    
    % B&W image 
    img3 = BW*val_1+BW2*val_2;
    

    您可以使用matlab文件交换(以下或以下)中的
    简单单种子区域生长
    函数(或其等效函数之一)。此函数将创建一个逻辑掩码,可用于使图像变黑(对多个区域连续调用此函数)

    I=im2double(imread('5Yo8l.png');
    J=羊角面包区域(0.01,I,0,0)
    imshow(I+J);
    函数Phi=羊角面包区域(公差、Igray、x、y)
    如果(x==0 | | y==0)
    imshow(Igray);
    [y,x]=ginput(1);%%%小心这里的(x,y)混淆
    结束
    Phi=假(大小(Igray,1),大小(Igray,2));
    ref=真(尺寸(Igray,1),尺寸(Igray,2));
    PhiOld=Phi;
    φ(uint8(x),uint8(y))=1;
    while(sum(Phi(:)~=sum(PhiOld(:))
    PhiOld=Phi;
    segm_val=Igray(Phi);
    平均值seg=平均值(segm_val);
    Posvoisisnsphi=imdeplate(Phi,strel('disk',1,0))-Phi;
    voisins=find(posVoisinsPhi);
    valeursVoisins=Igray(voisins);
    Phi(沃伊辛(沃伊辛>平均塞格-公差&沃伊辛<平均塞格+公差))=1;
    结束
    
    您可以使用matlab文件交换(以下或以下)中的
    简单单种子区域生长
    函数(或其等效函数之一)。此函数将创建一个逻辑掩码,可用于使图像变黑(对多个区域连续调用此函数)

    I=im2double(imread('5Yo8l.png');
    J=羊角面包区域(0.01,I,0,0)
    imshow(I+J);
    函数Phi=羊角面包区域(公差、Igray、x、y)
    如果(x==0 | | y==0)
    imshow(Igray);
    [y,x]=ginput(1);%%%小心这里的(x,y)混淆
    结束
    Phi=假(大小(Igray,1),大小(Igray,2));
    ref=真(尺寸(Igray,1),尺寸(Igray,2));
    PhiOld=Phi;
    φ(uint8(x),uint8(y))=1;
    while(sum(Phi(:)~=sum(PhiOld(:))
    PhiOld=Phi;
    segm_val=Igray(Phi);
    平均值seg=平均值(segm_val);
    Posvoisisnsphi=imdeplate(Phi,strel('disk',1,0))-Phi;
    voisins=find(posVoisinsPhi);
    valeursVoisins=Igray(voisins);
    Phi(沃伊辛(沃伊辛>平均塞格-公差&沃伊辛<平均塞格+公差))=1;
    结束
    
    这是否也会给出很多噪声点?这些区域不需要有与图像其他部分不同的阴影。@Roneymael你说得对,我选择了一个非常快速和肮脏的解决方案。我将不得不改变它,以消除残羹剩饭。这不会给很多噪音点,以及?这些区域不需要有阴影