如何将一个图像分割成几个弯曲形状的小图像?

4次浏览(最近30天)
我有一个图像,我想把它分成小的弯曲形状的图像,而不使用手动裁剪。例如,附加的输入将被分割成曲线形状的小区域,这些区域由线表示。
提前谢谢你的帮助。
1评论
Bjorn Gustavsson
Bjorn Gustavsson 2021年8月11日
我的代码片段是一个示例,说明如何计算/提取这样的弯曲段——前提是边界的形状与 cos (x * 2 *π/ n_hor_pix) 宽度已知。对于你使用这个片段,你必须想出一种方法来以一种整洁的方式生成段边界-我希望你不希望你上面用红色画的线(我猜),那些更能代表你想要的东西,如果你可以用某种简单的sin/钟型曲线来建模,你可以很容易地修改我的例子中y坐标的生成。如果我误解了你的问题,那么你可能需要更准确地解释你想要什么。

登录评论。

接受的答案

图像分析
图像分析 2021年8月11日
试试这个:
演示如何在横截面图像中查找层。
clc;清除命令窗口。
关闭所有关闭所有图形(imtool.)
清晰;删除所有现有变量。或者clearvars。
工作空间;确保显示工作区面板。
格式长g
格式紧凑的
fontSize = 20;
%--------------------------------------------------------------------------------------------------------
图像读取百分比
grayImage = imread(“C2_down5um_246.jpg”);
获取图像的尺寸。
% numberOfColorChannels对于灰度图像应该= 1,对于RGB彩色图像应该= 3。
[rows, columns, numberOfColorChannels] = size(grayImage)
如果1 . numberOfColorChannels >
这并不是我们所期望的灰度,而是彩色。。
提取红色通道(因此品红线将是白色的)。
grayImage = grayImage(:,:, 1);
结束
%--------------------------------------------------------------------------------------------------------
显示图像。
Subplot (2,2,1);
imshow (grayImage []);
轴(“上”“图像”);
标题(“原始灰度图像”“字形大小”字形大小,“翻译”“没有”);
impixelinfo;
hFig = gcf;
hFig。WindowState =“最大化”%可能无法在早期版本的MATLAB中工作。
drawnow;
% Binarize
lowThreshold = 35;
highThreshold = 255;
% [lowThreshold, highThreshold] = threshold(lowThreshold, highThreshold, grayImage);
mask = grayImage > lowThreshold;
取最大的一团
Mask = bwareafilt(Mask, 1);
显示图像。
Subplot (2,2,2);
imshow(面具,[]);
轴(“上”“图像”);
标题(“面具”“字形大小”字形大小,“翻译”“没有”);
impixelinfo;
%扫描以获得顶部行。
[rows, columns] = size(mask);
首先找到顶部曲线。
topRows = nan(1, columns);
Col = 1:列
T = find(mask(:, col), 1,“第一”);
如果~ isempty (t)
topRows(col) = t;
结束
结束
持有
情节(topRows的r -“线宽”3)
显示图像。
Subplot (2,2,3);
imshow (grayImage []);
轴(“上”“图像”);
标题(“原始灰度图像”“字形大小”字形大小,“翻译”“没有”);
impixelinfo;
drawnow;
持有
%做一堆,每一个都比前一个低。
delta = round(rows/8)
allCurves = nan(7, columns);
nonObjectIndexes = isnan(topRows);
K = 1:7
得到这条曲线。
thisRow = topRows + (k-1) * delay;
将它剪辑到图像的底部。
thisRow = min(thisRow, rows);
再次创建没有对象NaN的列——它们是365。
thisRow(nonObjectIndexes) = nan;
allCurves(k,:) = thisRow;
情节(thisRow的r -“线宽”3)
结束
但不确定之后你想做什么。当图像的左右边缘什么都没有的时候,真的有必要将曲线一直延伸到图像的左右边缘吗?如果是这样,我们可以用polyfit()将曲线拟合为二次曲线,并以这种方式扩展它。
17日评论

登录评论。

更多答案(2)

Bjorn Gustavsson
Bjorn Gustavsson 2021年8月11日
编辑:Bjorn Gustavsson 2021年8月11日
你应该可以用 interp2 ,你只需要选择曲线区域的坐标用于插值点。就像这样:
Im =峰值(234);
Y = 1:23;
X = 1:234;
[x,y] = meshgrid(x,y);
Y = Y + 130 -30*cos(x*2* /234);这只是曲线的一个例子。
次要情节(2、2、1)
显示亮度图像(Im)
持有
情节(x (1:), y (1:)“k”。
情节(x(最终,:),y(最终,:)“k”。
peaksCurved = interp2(1:234,1:234,Im,x,y);
次要情节(2 2 2)
显示亮度图像(peaksCurved)
caxis ([-6.5493, 8.106])
次要情节(2,2,3)
peaksCurved pcolor (x, y), caxis([-6.5493, 8.106]),阴影
ij
轴([1 234 1 234])
HTH
6个评论
Bjorn Gustavsson
Bjorn Gustavsson 2021年8月12日
"由test.jpg指示的"不够具体,我们无法理解您希望通过什么标准确定区域边界。
下面的图像分析师猜测它是最上面区域的一些灰度强度边界,然后向下移动它。我猜你可以用某种函数形式来表示边界,并通过插值得到弯曲区域的强度。
你必须明白,为了得到你想要的解决方案,你必须精确地指定你想要的是什么。你手写的边界可以用来生成边界,但那是:a是一个麻烦,b似乎相当不精确和随意。
重复你用潦草的线条引用图像不会给我们任何新的和更精确的信息。

登录评论。


图像分析
图像分析 2021年8月11日
请附上你的原图。
我要做的是先尝试得到上曲面/曲线,因为那是最亮的。你可能只需要阈值然后扫描找到阈值以上的第一个像素。对于下面的曲线,只需从上面的曲线中减去一些数字。类似的
mask = grayImage > someValue;
Mask = bwareafilt(Mask, 1);采取最大的努力摆脱噪音。。
[rows, columns] = size(mask);
首先找到顶部曲线。
topRows = nan(1, columns);
Col = 1:列
T = find(mask(:, col), 1,“第一”
如果~ isempty (t)
topRows(col) = col;
结束
结束
持有
%做一堆,每一个都比前一个低。
delta = round(rows/8)
allCurves = 0 (7, columns);
K = 1:7
allCurves(k,:) = topRows + (k-1) * delay;
情节(allCurves (k,:),的r -“线宽”3)
结束
%剪辑到图像底部
allCurves = min(所有曲线,行);
2的评论
动态
动态 2021年8月13日
@Image分析师 谢谢你的支持。万博1manbetx是的,我可以为整个图像添加噪声,但是,我想为每个波段添加不同的噪声方差。谢谢你的代码。
然而,我仍然有一个问题要解决。如果我想要50%的重叠带,那么如何修改这段代码?求你了,你能修改一下代码吗?
非常感谢

登录评论。

类别

了解更多图片帮助中心而且文件交换

社区寻宝

在MATLAB Central中找到宝藏,并发现社区如何帮助您!

开始狩猎!