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

35意见(过去30天)
动态
动态 2021年8月11日
评论道: 动态于2021年8月13日在21:42
我有一个图像,我想把它分成小曲线形状的图像,不使用手动裁剪。例如,附加的输入将被分割成曲线形状的小区域,用直线表示。
提前感谢你的帮助。
1评论
Bjorn Gustavsson
Bjorn Gustavsson 2021年8月11日
我的代码片段是如何计算/提取一个这样的弯曲段的示例 - 只要边界具有与之成比例的形状 cos (x * 2 *π/ n_hor_pix) 并且是已知的宽度。让你使用那个赛段,你必须以一种简洁的方式来提出一种方法来生成分段边界 - 我希望你不希望你在上面的红色中绘制的线(我猜测)更代表您想要的,如果您可以模拟某种简单的SIN / BELL类型曲线,您可以在我的示例中修改Y-CONERATE的生成相当容易。如果我解释了你的问题,那么你可能必须更准确地解释你想要的。

登录评论。

接受答案

图像分析师
图像分析师 2021年8月11日
试试这个:
演示在横断面图像中查找图层。
clc;%清除命令窗口。
关闭所有%关闭所有数字(除了IMTool之外。)
清晰;删除所有已存在的变量。或者clearvars,如果你想的话。
工作区;%确保显示工作区面板。
格式长g
格式袖珍的
fontsize = 20;
%--------------------------------------------------------------------------------------------------------
%读取映像
灰度= imread(“C2_down5um_246.jpg”);
%获取图像的尺寸。
对于灰度图像,% numberOfColorChannels = 1,对于RGB彩色图像,% numberOfColorChannels = 3。
[rows, columns, numberOfColorChannels] = size(grayImage)
如果numberofcolorchannels> 1
%它不是真正的灰度,就像我们预期的那样 - 它是颜色的。
%提取红色通道(因此品红色线将是白色)。
grayImage = grayImage(:,:, 1);
结尾
%--------------------------------------------------------------------------------------------------------
%显示图像。
次要情节(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;
取最大的blob
面具= bwareafilt(面具,1);
%显示图像。
子图(2,2,2);
imshow(面具,[]);
轴(“上”“图像”);
标题(“面具”'字体大小'字形大小,“翻译”'没有任何');
Impixelinfo;
%扫描获取顶行。
[rows, columns] = size(mask);
%首先找到顶级曲线。
Toprows = NaN(1,列);
为了Col = 1:列
T = find(mask(:, col), 1,'第一的');
如果〜isempty(t)
顶部(col)= t;
结尾
结尾
持有
情节(topRows的r -'行宽'3,3)
%显示图像。
子图(2,2,3);
imshow(grayImage,[]);
轴(“上”“图像”);
标题('原始灰度图像''字体大小'字形大小,“翻译”'没有任何');
Impixelinfo;
drawnow;
持有
做一堆,每一个都比前一个低。
δy =圆(行/ 8)
allCurves = nan(7,列);
nonobjectIndexes = Isnan(顶部);
为了K = 1: 7
得到这条曲线。
thisRow = topRows + (k-1) *延迟;
%夹在图像的底部。
thisRow = min(thisRow, rows);
% Make再次没有对象NaN的列-它们是365。
thisRow (nonObjectIndexes) =南;
Allcurves(k,:) = attrow;
情节(本质,的r -'行宽'3,3)
结尾
不确定在此之后想要做什么。当没有什么时候没有什么可以将曲线一直延伸到图像的左边和右边缘?如果是这样,我们可以将曲线与polyfit()相匹配,并将其延伸。
17评论

登录评论。

更多的答案(2)

Bjorn Gustavsson
Bjorn Gustavsson 2021年8月11日
编辑:Bjorn Gustavsson 2021年8月11日
你应该能够这样做 interp2. ,你只需要选择曲线区域的坐标来插值点。是这样的:
我=峰(234);
y =收窄;
x = 1:234;
(x, y) = meshgrid (x, y);
Y = Y + 130 -30 * cos(x * 2 * pi / 234);%这只是你的曲线的示例
次要情节(2、2、1)
ImagesC(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.
Axis ([1 234 1 234])
Hth.
6评论
Bjorn Gustavsson
Bjorn Gustavsson 2021年8月12日
“由test.jpg表示”对我们来说不够具体,无法理解您希望以什么标准来确定您的区域边界。
下面的图像分析师猜测它是最上面区域的灰度级强度边界,然后将它向下移动。我猜你可以用一些函数形式来表示边界通过插值得到曲线区域的强度。
你必须明白,为了得到你想要的解你必须明确你想要的是什么。你手写的边界可以用来生成边界,但这是:a是一个麻烦,b似乎相当不精确和武断。
用你潦草的线条重复你对图像的引用不会给我们任何新的和更精确的信息。

登录评论。


图像分析师
图像分析师 2021年8月11日
请附上你的原图。
我要做的是首先得到上表面/曲线,因为那是最亮的。你可以只设置一个阈值,然后通过扫描找到高于阈值的第一个像素。对于下面的曲线,只需从上面减去一些数字。类似的
mask = grayImage > somvalue;
面具= bwareafilt(面具,1);采取最大的努力以摆脱噪音。
[rows, columns] = size(mask);
%首先找到顶级曲线。
Toprows = NaN(1,列);
为了Col = 1:列
T = find(mask(:, col), 1,'第一的'
如果〜isempty(t)
topRows卡扎菲(col) =;
结尾
结尾
持有
做一堆,每一个都比前一个低。
δy =圆(行/ 8)
AllCurves =零(7,列);
为了K = 1: 7
allCurves(k,:) = topRows + (k-1) * delay;
情节(allCurves (k,:),的r -'行宽'3,3)
结尾
%剪辑到图像底部
Allcurves = Min(Allcurves,Rows);
2的评论
动态
动态 在2021年8月13日15:55
@image分析师 谢谢你的支持。万博1manbetx是的,我可以添加杂色到整个图像,但是,我想为每个波段添加不同的杂色。谢谢你的代码。
然而,我仍然有一个问题要解决。如果我想要50%的重叠波段,那么如何修改这个代码?拜托,你能修改一下代码吗?
非常感谢

登录评论。

社区宝藏狩猎

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

开始狩猎!

被某某人翻译