删除有机分子图中不需要的字符

Noo*_*ber 3 matlab image-processing computer-vision image-segmentation

我有这个图像:

在此输入图像描述

我想删除图像中不构成有机分子结构一部分的所有部分.所以在这个特定的图像中,我想删除Process A和line below it.我试图用来bwlabel获取连接的组件,但结构本身并不构成一个单独的组件.因此,不可能通过该方法移除.知道我怎么能解决这个问题吗?

ray*_*ica 8

根据您的偏好,有两种方法可以解决这个问题.

方法#1 - 使用 bwareaopen

一种廉价的方法是反转图像,使对象像素为白色而不是黑色,然后对图像进行形态学关闭并去除那些落在一定量以下的区域.关闭会将断开的区域连接在一起,并且利用加入"结构"将生成具有大面积的区域,您可以按每个区域的面积阈值并消除那些低于一定量的区域.

然后,您可以通过简单地AND使用反转图像和闭合结果执行逻辑来获取原始图像,然后重新转换此中间结果.这样做的结果是,由于关闭操作人为地创建对象像素,我们只保留属于原始图像的像素.具体地,结构的附近区域的连接将创建新的对象像素,因此执行AND将确保与原始不共同的那些像素被移除.由于这是在原始结果的反方向上执行的,因此重新转换会使您返回到对象像素的原始域,而不是白色.

像这样的东西:

%// Read in image from StackOverflow
im = imread('http://i.stack.imgur.com/A7iT7.png');

%// Invert image
im = ~im;

%// Define 50 x 50 structuring element and close the image
se = strel('square', 50);
out = imclose(im, se);

%// Remove regions whose areas fall below 10000 pixels
out = bwareaopen(out, 10000);

%// Remove out extraneous closing areas by ANDing with inverted image
%// then reinvert to bring back to original label scheme
out = ~(im & out);

%// Show the image
imshow(out);
Run Code Online (Sandbox Code Playgroud)

我们得到这个图片:

在此输入图像描述

笔记

  1. 该函数imclose将使用定义的结构元素为您执行形态学闭包strel.我使用50 x 50的方格来确保我们有足够大的窗口将相邻的对象像素连接在一起.
  2. 该函数bwareaopen接收二进制图像并去除像素区域低于特定量的区域.关闭后,您将拥有两个连接区域 - 图像顶部带有结构,底部带有文本.通过实验,10000个像素去除了底部的区域.

方法#2 - 使用 regionprops

与方法#1相关,执行此操作并与阈值无关的替代方法是遵循您的原始想法.执行关闭操作,然后评估每个连接区域的区域并选择面积最大的区域.我建议regionprops在这种情况下使用,这是一种专门用于分析不同图像区域特征的功能.输出将是N元素的结构,其中N是图像中找到的唯一和连接对象的总数,每个结构包含您要在图像中测量的属性字段.在您的情况下,请指定 包含每个区域的区域和列主要像素位置'Area'的'PixelIdxList'属性和属性.

您将找到整体的最大区域并使用相应的像素位置并设置您合乎逻辑的输出映射AND.

像这样的东西:

%// Read in image from StackOverflow
im = imread('http://i.stack.imgur.com/A7iT7.png');

%// Invert image
im = ~im;

%// Define 50 x 50 structuring element and close the image
se = strel('square', 50);
out = imclose(im, se);

s = regionprops(out, 'Area', 'PixelIdxList'); %// Apply regionprops

%// Find the region with the max area
[~,id] = max([s.Area]);

%// Create an output mask with the largest area
%// Make logical
out = false(size(im));

%// Set pixels from largest area
out(s(id).PixelIdxList) = true;

%// Rest of the logic from before
%// Remove out extraneous closing areas by ANDing with inverted image
%// then reinvert to bring back to original label scheme
out = ~(im & out);

%// Show the image
imshow(out);
Run Code Online (Sandbox Code Playgroud)

您应该得到与第一种方法完全相同的结果.