杨振宁大学物理视频中黄色的字,c#写程序去掉(原版改进,三)

ops/2024/12/16 1:04:53/

上一节,我们分清了主次矛盾,并搞定了主要矛盾(去掉黄色的字),这一节解决次要矛盾(矩形色带)。

我们的想法如图:

1,我们找到稳定黄色的最左边,最右边两点,画两条竖线,竖线高度10,根据这两条竖线,分别向外拉伸10条横线。代码如下:

for (int i = 240; i <480; i++)
                        {
                            byte fugair = 0; byte fugaig = 0; byte fugaib = 0;
                            byte fugai = 0;
                      
                            for (int j = 0; j < 640; j++)
                            {
                                int n = i * ww + j;
                                float hue = 0;
                 RGB2HSLTest(rgbValues[4 * n + 2], rgbValues[4 * n + 1], rgbValues[4 * n], ref hue);

                          if (hue > 35 && hue < 85 )//,黄色范围给的比较宽泛                       
                    {//黄色
                      
                        //新增,寻找黄色字50-63外接矩形202412130850
                        if (hue > 50 && hue < 63)//黄色收窄
                        {
                            if (j  < 找最小) { 找最小 = j ; 存黄色始末[0].X=找最小 ;存黄色始末[0].Y=i ;}
                            if (j > 找最大) { 找最大 = j ; 存黄色始末[1].X = 找最大; 存黄色始末[1].Y = i ; }
                        }

   rgbValues[4 * n + 2] = (byte)(rgbValues[4 * n + 2 - 4 * ww] / 2 + fugair / 2);
                                    rgbValues[4 * n + 1] = (byte)(rgbValues[4 * n + 1 - 4 * ww] / 2 + fugaig / 2);
                                    rgbValues[4 * n] = (byte)(rgbValues[4 * n - 4 * ww] / 2 + fugaib / 2);

}else{......}

2,存黄色始末[0]就是黄色最左点,存黄色始末[1]就是黄色最右点。

根据这两点,向外各画出十条直横线线,找到穿越点,我们目的是找到边界,即线A和B。如图:

代码如下:

   Point[] 左侧穿越点 = new Point[10]; int b= 0;
   
    for (int xy = 存黄色始末[0].Y - 5; xy < 存黄色始末[0].Y + 5; xy++)
    {
        for (int j = 存黄色始末[0].X; j >0; j--)//
        {
            int n = xy * 640 + j;
            if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 1]) > 10)
            {
                左侧穿越点[b].X = j;
                左侧穿越点[b].Y = xy;
                break;
            }
        }
        b++;
    }
    Point[] 右侧穿越点 = new Point[10]; int a = 0;
            for (int xy = 存黄色始末[1].Y - 5; xy < 存黄色始末[1].Y + 5; xy++)
            {
                for (int j = 存黄色始末[1].X; j < 640; j++)//
                {
                    int n = xy * 640+ j;
                    //找灰度化大于10的点
                    if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 1]) > 10)
                    {
                        右侧穿越点[a].X = j;
                        右侧穿越点[a].Y = xy;
                        break;
                    }

                }
                a++;
            }

3,利用a竖线和b竖线的起点,各往后退3个像素,往上做垂线,找到色带水平线cd,会找到c.y和d.y值,如果相差小于2个像素,我们就认为色带水平线确认了。如图:

代码如下:

   Point[] 向上穿越点 = new Point[2];
            向上穿越点[0].X = 左侧穿越点[0].X+3; 向上穿越点[0].Y = 左侧穿越点[0].Y;
            向上穿越点[1].X= 右侧穿越点[0].X-3; 向上穿越点[1].Y= 右侧穿越点[0].Y;
            int y上界 = 0;
            int y上界1 = 0;
            for (int xy = 向上穿越点[0].Y; xy >0; xy--)
            {

                int n = xy * 640 + 向上穿越点[0].X;
                if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 640]) > 10)
                {
              
                    y上界 = xy;
                    break;
                }
                
            }
            for (int xy = 向上穿越点[1].Y; xy > 0; xy--)
            {

                int n = xy * 640 + 向上穿越点[1].X;
                if (Math.Abs(glob_buffer8[n] - glob_buffer8[n - 640]) > 10)
                {
                  
                    y上界1 = xy;
                    break;
                }

            }

  if (Math.Abs(y上界1 - y上界) <= 2)
            {
                //ok,找到矩形色带上界
            }
            else
            {
                return; 
            }

4,色带矩形的高有一个经验值118.所以这个色带矩形在视频中有变化,我们有了自动化应对的方法。我们前面也说过了,色带矩形比其他灰度相比,少了50,现在色带矩形中所有像素全部加上50,就ok了。

看到我们上面红色return了没有,如果矩形估计失败(背景出现一堆学生),色带矩形还会在,但黄色还是稳定处理过了。

 // (  消除色带矩形 )            

  for (int i =左侧穿越点[0].X; i < 右侧穿越点[0].X; i++)
      
                for (int j = y上界 ; j < y上界 +118; j++)
             
                {
                    int temp = j * 640 + i;//原方法
                    rgbValues[temp * 4] = (byte)(rgbValues[temp * 4] + 50 > 255 ? 255 : rgbValues[temp * 4] + 50);
                    rgbValues[temp * 4 + 1] = (byte)(rgbValues[temp * 4 + 1] + 50 > 255 ? 255 : rgbValues[temp * 4 + 1] + 50);
                    rgbValues[temp * 4 + 2] = (byte)(rgbValues[temp * 4 + 2] + 50 > 255 ? 255 : rgbValues[temp * 4 + 2] + 50);
                                                        
                }

这个改进型原版,肯定比原版自适应性好很多!


http://www.ppmy.cn/ops/142252.html

相关文章

ElementEye,网页分析器

介绍 我们经常使用Python写爬虫&#xff0c;爬到网页数据之后&#xff0c;就需要用beautifulSoup进行解析。因为写爬虫并不是我的主营工作&#xff0c;大多数只是用来分析一下想要的数据而已&#xff0c;所以经常会忘记beautifulSoup的用法。 同时&#xff0c;我们总是分析页面…

动手学深度学习-线性神经网络-softmax回归

目录 分类问题 网络架构 全连接层的参数开销 softmax运算 小批量样本的矢量化 损失函数 对数似然 softmax及其导数 交叉熵损失 信息论基础 熵 信息量 重新审视交叉熵 模型预测和评估 小结 在上上上一节中我们介绍了线性回归。 随后&#xff0c;然后在上上一节中…

java实现word转换pdf,word文件转换pdf文件,java如何将word转换pdf

1.java依赖 <dependency><groupId>com.aspose.cells</groupId><artifactId>aspose-cells</artifactId><version>8.5.2</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>…

树的遍历【东北大学oj数据结构7-3】C++

题面 二叉树是递归定义的。 二叉树 T 是定义在有限节点集上的结构 不包含节点&#xff0c;或者由三个不相交的节点集组成&#xff1a; 一个根节点。称为左子树的二叉树。称为右子树的二叉树。 您的任务是编写一个程序&#xff0c;该程序基于以下算法执行树遍历&#xff08;系…

【jvm】GC Roots有哪些

目录 1. 说明2. 虚拟机栈&#xff08;栈帧中的局部变量表&#xff09;中的引用3. 方法区中的类静态属性引用4. 本地方法栈&#xff08;Native方法栈&#xff09;中JNI&#xff08;Java Native Interface&#xff09;的引用5. 活跃线程&#xff08;Active Threads&#xff09;6.…

网络编程02

1. 回显服务器——UDP 一个 UDP 的客户端/服务器通信的程序——回显服务器&#xff08;echo server&#xff09;&#xff1a; 这个程序只是单纯地调用 Socket API 1&#xff09;让客户端给服务器发送一个请求&#xff0c;请求就是从控制台输入的字符串 2&#xff09;服务器…

Layer Norm 提升训练稳定性的原理:解决权重初始值敏感性问题(中英双语)

Layer Norm 提升训练稳定性的原理与数值模拟 在深度学习模型中&#xff0c;权重初始值对训练过程的稳定性影响极大&#xff0c;尤其在深层网络和长序列任务中&#xff0c;初始值不当会导致梯度消失或爆炸的问题&#xff0c;进而导致训练不稳定。Layer Normalization (Layer No…

开源分布式系统追踪-00-overview

分布式跟踪系列 CAT cat monitor 分布式监控 CAT-是什么&#xff1f; cat monitor-02-分布式监控 CAT埋点 cat monitor-03-深度剖析开源分布式监控CAT cat monitor-04-cat 服务端部署实战 cat monitor-05-cat 客户端集成实战 cat monitor-06-cat 消息存储 skywalking …