外观
解决问题思路
平时遇到的问题,如何解决的
记 Prism 跨模块事件订阅机制,不点击到页面就不触发
- SettingModule 中可能回收了
- 跨模块,事件对象是否还是同一个
prism 主域问题设置
RegionManager.SetRegionManager(mainWindow, _regionManager);
模型识别思路
yolo输出的模型无法在461中识别 输出的数量很大 框一点都对应不上 了解到张量、维度、输出结构
输入检测的是一个图像张量信息 输出的是一个目标检测模型的张量信息
在WPF中加载图片 在图片上做标记
需要在图片上划区域,打点位,由于图片尺寸很大,无用区域也多,做起来比较麻烦 本来的做法:
<Border x:Name="border"
Background="#FF030304"
CornerRadius="0,12,0,0">
<Grid>
<Canvas x:Name="canvas"
Width="{Binding ElementName=img, Path=ActualWidth}"
Height="{Binding ElementName=img, Path=ActualHeight}"
Panel.ZIndex="99"
Background="Transparent">
<Rectangle Name="selectionRectangle"
Stroke="Red"
StrokeThickness="2"
Visibility="Collapsed" />
</Canvas>
<Image x:Name="img" />
</Grid>
</Border>这样存在的问题及弊端:
- img的图片由于是动态加载的,导致无法获取到图片的大小(NaN)
- 于是默认加载一个图片
img.Source = new BitmapImage(new Uri("pack://application:,,,/Resources/FillImg.png", UriKind.Absolute)); //给个默认图 不然获取不到大小
- 于是默认加载一个图片
- 标记的框及点的位置需要通过计算原图及显示图的大小比例来计算获得,太麻烦了
- 实现方式
优化做法:
<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
<Canvas x:Name="canvas">
<Image x:Name="bigImg"
Source="{Binding ElementName=listimgLv, Path=SelectedItem.ImgPath}"
Stretch="None">
<Image.Clip>
<RectangleGeometry Rect="800,400,2000,1200" />
</Image.Clip>
<Image.RenderTransform>
<TranslateTransform X="-800" Y="-400" />
</Image.RenderTransform>
</Image>
<Rectangle x:Name="selectionRectangle"
Canvas.Left="1000"
Canvas.Top="400"
Width="400"
Height="400"
Stroke="Red"
StrokeThickness="2"
Visibility="Visible" />
</Canvas>
</ScrollViewer>解析:
- 使用
Image的Stretch=None显示图片原始大小 - 使用图片的
Clip剪裁结合RenderTransform位移 显示图片想要的部分(ROI)
var x = Canvas.GetLeft(selectionRectangle);
var y = Canvas.GetTop(selectionRectangle);
var w = selectionRectangle.Width;
var h = selectionRectangle.Width;
Debug.WriteLine($"{x+800} {y+400} {w} {h}"); //加上剪裁便宜的量 就可以得到实际在图片上的位置了如何在玻片中找到一个指定大小的区域
想要在定位图中找到样本区域的一个指定大小的区域如何实现??? 最初的想法和做法:
- yolo识别到区域
- 区域拿来解析
- 二值化后判断每个点的像素值,找到像素值都是255的 一个指定大小 弊端:
- 贼慢(因为一般优秀的区域在右边,他是左边向右找的,那我们从右向左试试?)
新思路:
- 生成一个纯白的图片 在二值化后的图上做匹配查找试试!!?
- 并且把roi图再剪裁一下 既然优先找右边,那把左边的一半干掉;上下边距再干掉一些 过程:
- 好像没有效果,纯白的图没有特征 无法匹配
找一种新模板匹配的方式来?只是不二值化 =>>积分图
用一个区域来计算特征,比如均值标准差梯度 {'position': (688, 188), 'size': (150, 120), 'mean': 192.9385, 'std': 30.583198231157844, 'gradient_mean': 36.141994} 但是这个受图片的质量光线等的影响很大,不同的图片特征有差别
- 如何兼顾大量图片的特征
- 如何兼容不同大小的情况
cv看图像金字塔 不同分辨率 机器学习SVM或随机森林,通过大量特征学习 图像金字塔不是这么用的,他是同一个图不同分辨率不同大小的分层
都不适用,还是回归二值化后找白色区域的方式,但是对二值化依赖严重,不同的玻片有差异,或许可以二值化后找到的区域再来对比平均特征
细胞视觉处理
使用opencv形态学处理图像计算细胞数量
使用的颜色空间来判断,受制于颜色 颜色变化影响很大,考虑使用yolo模型来识别
模型识别思路
python学习输出onnx模型,.NET使用。
yolo输出的模型无法在461中识别 输出的数量很大 框一点都对应不上 了解到张量、维度、输出结构
输入检测的是一个图像张量信息 输出的是一个目标检测模型的张量信息
解决方案,查找学习源码发现yolo返回的张量内容的点位是归一化的 意思就是返回的点是一个矩形的中心点,所以需要计算还原
思路步骤 项目之初使用OpenCV进行使用图片的分析,如玻片样本区域,切片后的细胞图像,在分析玻片样本区域使用的色彩空间匹配发现不同的玻片类型如血片髓片不能做到兼容且对推片质量要求高否则就会寻找到染色了但没有细胞的区域,应该有除去色彩空间匹配的其他方法,查阅资料、视频学习尝试后未能找到满意的方案,使用其他途经,把玻片的样本区域是为目标,即可用yolo模型进行目标检测,使用大量的玻片图标记训练测试识别后发现效果好,识别准确,但是在系统中使用需要转换模型格式待实装。 我们的系统所有细胞图像都高度依赖sdpc图片,使用sdpc图片都必经切片,而切片极度耗时与耗资源,尝试后发现能通过减少切片的面积来提升速度,减少切片的面积的取决于知道最佳区域的大概面积,可通过最佳区域选定的大小来反推跳过多少面积的切片,再通过计算切最小的面积来做识别。 最佳区域识别是扫描完成后图像细胞厚薄与均匀度较佳的区域,对细胞图像的质量要求高,质量差无法找到有效区域,考虑使用模型目标检测保证下限的方式标记一个靠右边且无空白细胞的区域,但尚未测试。 目前通过对切片的细胞均匀度分析,计算细胞的个数,粘连较多的细胞数量就会少或通过直方、纹理分析方法等方式判断(须丰富知识储备),达到选定最佳扫描区域的目的。
色彩空间匹配问题:您提到使用色彩空间匹配方法在不同类型玻片上存在兼容性问题,且对切片质量要求高。可以考虑使用基于深度学习的方法,如卷积神经网络(CNN),来识别和分类不同的玻片类型。这种方法对图像质量的要求较低,且能够处理更复杂的图像特征。
目标检测模型:您已经尝试使用YOLO模型进行目标检测,并取得了良好的效果。为了将模型集成到您的系统中,可以考虑使用ONNX(开放式神经网络交换)格式,它是一种开放的模型格式,可以让您轻松地在不同的深度学习框架之间转换模型。
切片优化:您提到通过减少切片面积来提升速度。可以考虑使用更高级的图像分析技术,如图像分割网络,来确定细胞的最佳区域,从而进一步减少切片面积。此外,可以使用图像金字塔方法,先在低分辨率下进行快速分析,再逐步提高分辨率以精确识别。
细胞图像均匀度分析:您提到了通过计算细胞数量和粘连程度来判断图像的均匀度。可以考虑使用纹理分析方法,如灰度共生矩阵(GLCM)或局部二值模式(LBP),这些方法可以量化图像的纹理特征,从而评估细胞的均匀分布情况。
最佳区域识别:为了识别扫描图像中细胞厚薄与均匀度较佳的区域,可以考虑使用活动轮廓模型(也称为水平集方法),这种方法可以通过演化过程找到图像中物体的边界,特别适合于复杂形状的物体,如细胞。
图像重叠区域检测:在处理多个图像时,OverlapNet可以用于检测图像间的重叠部分,这对于图像拼接和变化检测非常有用。OverlapNet结合了CNN和注意力机制,提高了重叠区域检测的准确性
在进行玻片样本区域和切片后细胞图像的分析时,我们最初采用OpenCV进行图像处理。然而,在分析玻片样本区域时,我们遇到了色彩空间匹配的问题。这种方法在不同类型的玻片(如血片和髓片)之间难以实现兼容性,并且对切片质量有很高的要求。如果切片质量不佳,可能会错误地识别到染色区域而没有细胞。因此,我们寻求除了色彩空间匹配之外的其他方法。
目标检测模型的应用: 经过研究和尝试,我们决定采用YOLO模型进行目标检测。通过大量标记玻片图像进行训练和测试,我们发现这种方法的识别效果良好且准确。但是,为了将模型集成到我们的系统中,我们需要将模型转换为适合实际部署的格式。
切片优化: 我们的系统高度依赖于SDPC图像,而SDPC图像的处理需要经过耗时且资源密集的切片过程。为了提高效率,我们尝试通过减少切片面积来提升速度。减少切片面积的关键在于确定最佳区域的大致面积,然后推算出可以跳过多少面积的切片,最终计算出最小需要切片的面积进行识别。
最佳区域识别: 最佳区域识别是指在扫描完成后,图像中细胞厚薄和均匀度较佳的区域。这对细胞图像的质量有很高的要求,如果图像质量差,将难以找到有效的区域。我们考虑使用目标检测模型来标记一个靠右边且无空白细胞的区域,以保证找到一个识别区域的下限,但尚未经过测试。
细胞图像质量分析: 为了选定最佳扫描区域,我们目前通过对切片的细胞均匀度进行分析。我们计算细胞的数量,发现粘连较多的细胞数量较少。此外,我们还考虑使用直方图和纹理分析方法来丰富我们的知识储备,以更准确地判断图像质量。
计划进一步测试和优化目标检测模型,以确保其在实际应用中的准确性和效率。同时,我们将继续探索和完善图像质量分析方法,以提高最佳区域识别的准确性。
