基于投影和众数特点的粘连sku分割

2024-05-25 00:38

本文主要是介绍基于投影和众数特点的粘连sku分割,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先是基本的投影:

/*** 图像向x轴做投影后的数组* * @param imagedata* @param w*            宽* @param h*            高* @return*/public static int[] xpro(BitSet bitSet, int width, int height) {int xpro[] = new int[width];for (int j = 0; j < width; j++) {for (int i = 0; i < height; i++) {if (bitSet.get(i * width + j) == true)xpro[j]++;}}return xpro;}public static int[] xpro(ImageData image) {return xpro(image.getBitSet(), image.getWidth(), image.getHeight());}/*** 图像向y轴做投影后的数组* * @param imagedata* @param w* @param h* @return*/public static int[] ypro(BitSet bitSet, int width, int height) {int ypro[] = new int[height];for (int i = 0; i < height; i++) {for (int j = 0; j < width; j++) {if (bitSet.get(i * width + j) == true)ypro[i]++;}}return ypro;}public static int[] ypro(ImageData image) {return ypro(image.getBitSet(), image.getWidth(), image.getHeight());}

然后是基于基本投影的图像分割(割线集合可以用容器,这里不改了):

public static Rectangle[] yproSegment(int[] ypro, int width, int height) {int[] L = new int[height - 1];// 左割线集合,最多n-1条分割线,且左分割第一项取0,即图片第一行做起点(需要a行位置没有太多空白噪声)int[] R = new int[height - 1];// 右割线集合// 两种情况:sku区域起始位置元素为空白区域;起始位置含字符元素int k1 = 0;int k2 = 0;if (ypro[0] != 0) {k1 = 1;L[0] = 0;}for (int i = 4; i < height; i++) {if (ypro[i] > 0 && ypro[i - 1] > 0 && ypro[i - 2] > 0&& ypro[i - 3] > 0 && ypro[i - 4] == 0) {L[k1] = i - 4;k1++;} else if (ypro[i] == 0 && ypro[i - 1] > 0 && ypro[i - 2] > 0&& ypro[i - 3] > 0 && ypro[i - 4] > 0) {R[k2] = i;k2 += 1;}}if (ypro[ypro.length - 1] != 0) {R[k2] = height;}List<Rectangle> c = new ArrayList<Rectangle>();for (int i = 0; i < R.length; i++) {if (R[i] != 0 && L[i] < R[i]) {c.add(new Rectangle(0, L[i], width, R[i] - L[i]));} else {break;}}Rectangle[] children = new Rectangle[c.size()];for (int i = 0; i < children.length; i++) {children[i] = c.get(i);}return children;}

但是有时候图像的sku是粘连的,可以利用图像中sku的特点(每行的宽度相似,比较规范,那么只要不是超过50%粘连,众数就必定是区分的合理阈值,再利用极值点作为分割点,以及众数作为校验参数)

/*** 纵向自动版面分析(众数参考分析)* * @param ypro* @param im* @param h* @param w* @return*/public static int[] ylinelayout(int[] ypro, int width, int height) {// 投影分割图片boolean flag = false;for (int i : ypro) {if (i == 0) {flag = true;break;}}if (flag == false) {int[] result = { 0, ypro.length };return result;}int[] L = new int[height - 1];// 左割线集合,最多n-1条分割线,且左分割第一项取0,即图片第一行做起点(需要a行位置没有太多空白噪声)int[] R = new int[height - 1];// 右割线集合// 两种情况:sku区域起始位置元素为空白区域;起始位置含字符元素int k1 = 0;int k2 = 0;if (ypro[0] != 0) {k1 = 1;L[0] = 0;}for (int i = 4; i < height; i++) {if (ypro[i] > 0 && ypro[i - 1] > 0 && ypro[i - 2] > 0&& ypro[i - 3] > 0 && ypro[i - 4] == 0) {//左边界特征L[k1] = i - 4;k1++;} else if (ypro[i] == 0 && ypro[i - 1] > 0 && ypro[i - 2] > 0&& ypro[i - 3] > 0 && ypro[i - 4] > 0) {//右边界特征R[k2] = i;k2 += 1;}}if (ypro[ypro.length - 1] != 0) {R[k2 + 1] = ypro.length - 1;}ArrayList<Integer> c = new ArrayList<Integer>();for (int i = 0; i < R.length; i++) {if (R[i] != 0 && L[i] < R[i]) {c.add(L[i]);c.add(R[i]);} else {break;}}int[] gap = new int[c.size() / 2];// 间隙for (int i = 0; i < gap.length; i++) {gap[i] = c.get(i * 2 + 1) - c.get(i * 2);}// 得到初次分割的所有“字符”的高度if (gap.length == 1) {int[] result = { L[0], R[0] };return result;}if (gap.length == 2) {int[] result = { L[0], R[0], L[1], R[1] };return result;}int Te = (int) (catchE(gap) + 0.5);ArrayList<Integer> newc = new ArrayList<Integer>();for (int i = 0; i < gap.length; i++) {if (gap[i] >= (int) (Te * 1.5 + 0.5)) {// 对异常gap进行二次分割(粘连字符二次分割函数)log.info("发现异常点:" + gap[i]);int[] newline = improveSegment(c.get(i * 2), c.get(i * 2 + 1),ypro, gap[i], Te);if (newline != null) {for (int j : newline) {newc.add(j);log.info("newline:" + j);}}}}int begin = 0;ArrayList<Integer> allline = new ArrayList<Integer>();allline.addAll(c);int time = 0;for (int i = 0; i < newc.size(); i++) {int th = newc.get(i);for (int j = begin; j < c.size() - 1; j++) {if (c.get(j) < th && c.get(j + 1) > th) {allline.add(j + 1 + time * 2, th);allline.add(j + 2 + time * 2, th + 1);begin = j;time++;break;}}}return ArrayUtils.toPrimitive(allline.toArray(new Integer[0]));}

众数查找:

/*** 找出众数范围(无补偿众数)* * @param gap* @return*/public static float catchE(int[] gap) {float Te = 0;int[] g = gap.clone();Arrays.sort(g);int[] times = new int[g.length];for (int i = 0; i < gap.length; i++) {for (int j = 0; j < g.length; j++) {if (g[j] == gap[i]) {times[j]++;}}}// 得到各gap的出现次数int tt = 0;int num = 0;for (int i = 0; i < times.length; i++) {if (times[i] > tt) {tt = times[i];num = i;}}Te = g[num];return Te;}

极值点查找

/*** 二次分割(找到粘连中的k个线,k》=2)* * @param localypro* @param begin* @param t1* @return*/public static int findline(int[] localypro, int begin, int t1) {int findline = 0;int len = localypro.length - t1;for (int i = begin; i < len; i++) {int kL = 0;int kR = 0;for (int j = 1; j < t1; j++) {if (localypro[i] <= localypro[i - j]) {kL++;} else {break;}if (localypro[i] <= localypro[i + j]) {kR++;} else {break;}}if (kL == t1 - 1 && kR == t1 - 1) {findline = i;break;}}return findline;}/*** 二次分割* * @param a* @param b* @param ypro* @param gapE* @param Te* @return*/public static int[] improveSegment(int a, int b, int[] ypro, float gapE,int Te) {if (Te <= 8)return null;int[] localypro = Arrays.copyOfRange(ypro, a, b + 1);// 以t2作为跃迁步长,避免同一区域出现多条分割线,以t1作为分割线阈值,以找到精确分割线ArrayList<Integer> c = new ArrayList<Integer>();int t1 = Te - 8;int t2 = Te - 5;for (int i = t2; i < localypro.length - t2; i = i + t2) {int findline = findline(localypro, i, t1);c.add(a + findline);}return ArrayUtils.toPrimitive(c.toArray(new Integer[0]));}

这篇关于基于投影和众数特点的粘连sku分割的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/999989

相关文章

便携式气象仪器的主要特点

TH-BQX9】便携式气象仪器,也称为便携式气象仪或便携式自动气象站,是一款高度集成、低功耗、可快速安装、便于野外监测使用的高精度自动气象观测设备。以下是关于便携式气象仪器的详细介绍:   主要特点   高精度与多功能:便携式气象仪器能够采集多种气象参数,包括但不限于风速、风向、温度、湿度、气压等,部分高级型号还能监测雨量和辐射等。数据采集与存储:配备微电脑气象数据采集仪,具有实时时钟、数据存

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

SAM2POINT:以zero-shot且快速的方式将任何 3D 视频分割为视频

摘要 我们介绍 SAM2POINT,这是一种采用 Segment Anything Model 2 (SAM 2) 进行零样本和快速 3D 分割的初步探索。 SAM2POINT 将任何 3D 数据解释为一系列多向视频,并利用 SAM 2 进行 3D 空间分割,无需进一步训练或 2D-3D 投影。 我们的框架支持各种提示类型,包括 3D 点、框和掩模,并且可以泛化到不同的场景,例如 3D 对象、室

基于YOLO8的图片实例分割系统

文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 segment_app.py 二、核心代码介绍篇2.1 segment_app.py2.2 scan_taskflow.py 三、结语 代码资源:计算机视觉领域YOLO8技术的图片实例分割实

如何将卷积神经网络(CNN)应用于医学图像分析:从分类到分割和检测的实用指南

引言 在现代医疗领域,医学图像已经成为疾病诊断和治疗规划的重要工具。医学图像的类型繁多,包括但不限于X射线、CT(计算机断层扫描)、MRI(磁共振成像)和超声图像。这些图像提供了对身体内部结构的详细视图,有助于医生在进行准确诊断和制定个性化治疗方案时获取关键的信息。 1. 医学图像分析的挑战 医学图像分析面临诸多挑战,其中包括: 图像数据的复杂性:医学图像通常具有高维度和复杂的结构

常见的投影类型及详细解释

常见的地图投影根据保留地球的不同几何特性(形状、面积、距离等)可以分为几大类。以下是常见的投影类型及详细解释: 一、正形投影(保持形状) 1. 墨卡托投影(Mercator Projection) 特点:保持形状,但严重扭曲面积,尤其在高纬度地区。应用:海洋导航、在线地图(如 Google Maps 在小比例尺下使用)。原理:投影将地球表面展开成矩形,经线垂直,纬线等距。优点:航线在图上为直

图像分割分析效果2

这次加了结构化损失 # 训练集dice: 0.9219 - iou: 0.8611 - loss: 0.0318 - mae: 0.0220 - total: 0.8915  # dropout后:dice: 0.9143 - iou: 0.8488 - loss: 0.0335 - mae: 0.0236 - total: 0.8816 # 加了结构化损失后:avg_score: 0.89

一文说清什么是AI原生(AI Native)应用以及特点

引言:智能新纪元 如今,走在街头,哪儿不被智能科技包围?智能音箱、自动驾驶汽车、聊天机器人......这些都在用不同的方式提升我们的生活体验。然而,究竟什么才能称得上“AI原生应用”呢? 什么是AI原生?   AI原生不仅仅是简单地引入人工智能功能。真正的AI原生应用犹如一个智慧的“大脑”,它的每一个决策都依赖于深度学习与数据分析。以Siri为例,它通过学习用户的习惯和需求,提供个性化的

过滤器:精密过滤器特点及应用范围概述

精密过滤器(又称作保安过滤器),筒体外壳一般采用不锈钢材质制造,内部采用PP熔喷、线烧、折叠、钛滤芯、活性炭滤芯等管状滤芯作为过滤元件,根据不同的过滤介质及设计工艺选择不同的过滤元件,以达到出水水质的要求。随着过滤行业的不断发展,越来越多的行业和企业运用到了精密过滤器,越来越多的企业加入了精密过滤器行业。   一、精密过滤器的性能特点及应用   1、精密过滤器的性能特点   (1)过滤精

过滤器:自清洗过滤器工作原理及特点阐述

一、自清洗过滤器的原理描述   当水从进水口进入并从外向里进入粗滤网(粗滤网的设置根据水质情况而定),较粗的杂质被过滤后再进入细滤网,较小的杂质被拦截在细过滤内壁,过滤后的干净水从出水口流出,当滤筒内壁的杂质越积越多时,自清洗过滤器进出口的压差达到预设值或达到清洗时间或手动预制时,过滤器将开始自清洗过程,整个自清洗过程包含两个步骤:打开位于自清洗过滤器上的自动排污阀;外部的双向电机带动吸吮扫