通过图像上的蒙版应用功能

时间:2013-11-23 22:34:52

标签: matlab masking impoly

我通过impoly('Closed', true)在图片上创建一个封闭区域,最后在Matlab命令行中标记掩码BW = createMask(h)的区域之后。 在图中为掩码标记点之前的初始命令

imshow('contour.png');
h = impoly('Closed',true);

在这里,我使用了下面的 nkjt 答案。 要通过函数 conditionalRemoval(图像,区域)

过滤的图片

enter image description here

然后,我跑

image = imread('contour.png');
areaLazyRemoval = BW; 
image = conditional_removal(image, areaLazyRemoval);

我现在有了mask和图片。 我应该将函数 conditional_removal 应用于它们。

现在如何使用此蒙版并在其标记区域中将该函数应用于该蒙版?

我的函数 conditional_removal 的伪代码是

function [ image ] = conditional_removal( image, areaLazyRemoval )
   % dim image 794 x 1001 x 3 uint
   % dim areaLazyRemoval 794 x 1001 logical
   image(:,:,1) .* areaLazyRemoval;    % TODO wrong operator here!
   % all pixels marked by logical ones in areaLazyRemoval should get lazyRemoval applied
   % else greedyRemoval so zero
   %
end
%%%%%%%%%%%%%%%%%%%%%%%
% lazy removal function
% so remove by 50% chance the thing
function pixel = lazyRemoval(pixel)
if randn > 0
    pixel = 0;
end 
% TODO how to apply pixel-wise removal to the logical matrix and image?

如何通过逻辑矩阵掩码将像素方式删除应用于图像?

2 个答案:

答案 0 :(得分:1)

由此:

  

impoly>生成数据> function createfigure1

你的意思是在调用impoly之后,你进入图窗口并选择“Generate Code”?这将创建一个函数createfigure - 但这与impoly无关。

有几种方法可以提取投资回报率 在选择具有impoly的区域之后,在关闭数字之前:

BW = createMask(h);

或者您可以使用getPosition提取位置,然后使用roipoly

答案 1 :(得分:0)

最后一个问题出在函数 conditional_removal 和创建 randn_logical_matrix

randn 的matlab文档说

  

RN = distributed.randn(...,classname)指定的类   分布式阵列D.有效选择与常规选择相同   randn函数:'double'(默认值),'single','int8','uint8',   'int16','uint16','int32','uint32','int64'和'uint64'。

因此,这表明现有功能不直接支持它。

所以我试图制作这个逻辑随机数生成器并通过掩码应用函数

clear;
close all;
image = imread('contour.png');
load('mask_1.mat');
areaLazyRemoval = BW;
image = image(:,:,1);
image  = conditional_removal(image, areaLazyRemoval);
image = double(image);
contour(image);
colorbar;
caxis([-2,1.5].*10^7);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function matrix = make_random_logical_matrix(matrix)

[row_max,column_max] = size(matrix);
matrix = randn(row_max,column_max);
for row = 1:row_max
    for column = 1:column_max
        t = randn;
        if t >= 0
            matrix(row,column) = 0;
        end
        if t < 0
            matrix(row,column) = 1;
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [ image ] = conditional_removal( image, areaLazyRemoval )
    random_logical_matrix = make_random_logical_matrix(areaLazyRemoval);
    areaLazyRemoval = areaLazyRemoval .* random_logical_matrix;
    areaLazyRemoval = uint8(areaLazyRemoval);
    image = image(:,:,1) .* areaLazyRemoval;
end

和轮廓

enter image description here

和网格

enter image description here

这似乎是好的解决方案。 为了改进,我认为应该计算情况的规范,然后 conditional_removal 算法相应地改进。