基于投影和众数特点的粘连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

相关文章

leetcode刷题(95)——416. 分割等和子集

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [1, 5, 11, 5]输出: true解释: 数组可以分割成 [1, 5, 5] 和 [11]. 示例 2: 输入: [1, 2, 3, 5]输出: false解释: 数组不能分割成两个元素和相等的子

智慧校园综合门户有哪些特点?

智慧校园的门户系统,作为整个智慧校园架构的门户窗口,扮演着至关重要的角色。它如同一座桥梁,将校园内的各种信息资源、应用服务以及管理功能紧密相连,为师生、家长及管理人员提供了一个集中访问的便捷通道。智慧校园门户的设计理念,是通过网络技术的巧妙运用,确保教育管理和学习体验的无缝对接,推动教育信息化进程迈向新的台阶。那么,一个符合学校使用的综合门户,有哪些特点呢? 1.一键登录,全网通行 采用统一的

JS变量特点及分号用法

1、JS可以在head、body中出现; 2、不管有多少,JS都是一个整体,即变量可通用 3、如果变量被重新声明,但没有被赋值,则原来的值仍保留; 4、如果变量被重新声明,并被赋值,则变量的值就会发生改变; 5、JS中的分号表示一段功能体的结束,如果有换行,可以不用加分号,凡是能加分号的,加上分号就可以,最好别省,养成习惯!

细胞核的分割与分类模型·hover net| 补充文档

小罗碎碎念 这期推文算是hover net系列的一个补充文档,把几个非常重要的脚本拿出来单独做了一个分析,感兴趣的自取。 extract_patches.pyconfig.pydataset.pyopt.pyrun_infer.py 一、extract_patches.py 1-1:加载和处理图像数据集 注意 dataset属于自建函数,所以一定要保证这个文件与你的代码执行文

基于matlab的K-means聚类图像分割

1 原理 K-means聚类算法在图像分割中的应用是基于一种无监督的学习方法,它将图像中的像素点或特征区域划分为K个不同的簇或类别。以下是K-means聚类算法用于图像分割的原理,包括步骤和公式: 1.1 原理概述 选择簇的数量(K): 首先,用户需要指定要将图像数据分成多少个簇(即K的值)。初始化聚类中心: 随机选择K个像素点作为初始聚类中心。分配数据点到最近的聚类中心: 对于图像中的每个

【yolov8语义分割】跑通:下载yolov8+预测图片+预测视频

1、下载yolov8到autodl上 git clone https://github.com/ultralytics/ultralytics 下载到Yolov8文件夹下面 另外:现在yolov8支持像包一样导入,pip install就可以   2、yolov8 语义分割文档 看官方文档:主页 -Ultralytics YOLO 文档 还能切换成中文版本,真友好。 看以下y

图像分割(四)---(图像显示、灰度直方图和三维灰度图综合分析选取最佳分割方法)

一、引言        对彩色图像进行分割的一种常用方法,是先把彩色图像转灰度图像,然后再选择合适的阈值进行二值分割。但有时彩色图像转灰度图像后不具有典型的双峰特性,二值分割效果不好。本文章提出一种确定彩色图像分割方法的新思路。首先读入一幅彩色图像fruit.jpg,然后对其各通道的灰度直方图进行分析,并使用imtool进行分析,利用surf绘制R-B的三维灰度图(水果的灰度值明显在背景上方,为

什么是js?特点是什么?组成部分?

Js是一种直译式脚本语言,一种动态类型,弱类型,基于原型的高级语言。 直译式:js程序运行过程中直接编译成机器语言。 脚本语言:在程序运行过程中逐行进行解释说明,不需要预编译。 动态类型:js声明变量后,可以随时改变它的数据类型。 弱类型:不需要提前做类型声明,而是程序在运行过程中检查它的数据类型。 Js的特点: 简单性:js使用的数据类型是弱类型,没有采用严格的数据类型。 安全性:

box-shadow投影

格式 box-shadow: h-shadow v-shadow blur spread color inset; 比如 box-shadow:10px 10px  20px  5px  block;    //前两个值可以为负值,表示向上或向左 当需要四周阴影时,前两个值都设为0 0即可。

今日分享丨浅谈RAG的技术特点及优势

一、引言 随着AI技术的发展,我们见证了人工智能在理解和处理自然语言方面取得的巨大进步。特别是结合了检索增强生成(Retrieval-Augmented Generation, RAG)和大语言模型(Large Language Model, LLM)的系统,为解决复杂查询和提供精确答案提供了强大的工具。RAG通过检索相关信息,增强了大模型的对问题的理解能力,利用RAG的优势,提供了广泛的知识覆