【问题标题】:To apply a function through a mask on an image通过图像上的蒙版应用功能
【发布时间】:2013-12-08 17:51:03
【问题描述】:

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

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

在这里,我在下面使用了 nkjt 的 答案。 函数conditionalRemoval(image, area)

要过滤的图片

然后,我跑

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?

如何通过逻辑矩阵蒙版对图像进行逐像素移除?

【问题讨论】:

  • 您必须将数据传递给createfigure 才能绘制它。 createfigure 的代码是什么?
  • 我提供了该问题的 SSCCE 示例,以便您可以重现该问题。现在有一个问题的最小图片,如何创建它的代码,如何使用它的代码以及错误。
  • 我根据nkjt的回答更新了正文。

标签: matlab masking impoly


【解决方案1】:

通过这个:

impoly > 生成数据 > 函数 createfigure1

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

您可以通过多种方式提取投资回报率。
选择impoly的区域后,合图前:

BW = createMask(h);

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

【讨论】:

  • 问题是,如果我尝试使用 BW = createMask(h),当图形处于活动状态时,我无法输入任何内容:dl.dropboxusercontent.com/u/62073194/… 你能举个例子吗请您现在可以使用 getPostionroipoly
  • 那是因为你打电话给position = wait(h);你需要吗?
  • 我不需要这个命令。这是一个错误,我没有注意到。非常感谢您的回答!我更新了正文以考虑现在的主要问题,即如何通过图像上的蒙版应用功能。
【解决方案2】:

最后的问题在于函数 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

和轮廓

和网格

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

【讨论】:

    猜你喜欢
    • 2023-02-18
    • 2021-02-20
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多