4.2 比多数opencv函数效果更好的二值化(python)

news2024/11/26 4:48:07

在这里之间写代码:

import numpy as np
import torch
import torch.nn as nn
import cv2

#1.silu激活函数
class SiLU(nn.Module):
    @staticmethod
    def forward(x):
        return x*torch.sigmoid(x)

#2.获得轨道的类
def railway_classes3(img,x1,x2,y1,y2):
    img2 = img[x1:x2, y1:y2, :]
    return img2

class Conv(nn.Module):
    def __init__(self):
        super(Conv, self).__init__()
        #标准化加激活函数

        self.bn     = nn.BatchNorm2d(3)#标准化
        self.act    = SiLU()

    def forward(self,x):
        #x=self.conv(x)
        x=self.bn(x)
        x= self.act(x)

        return x



if __name__ == "__main__":
    #输入图片路径
    image=cv2.imread(r"imgs/000002.jpg")

    img2=railway_classes3(image, x1=640, x2=740, y1=825, y2=1025)
    cv2.imshow("ss",img2)
    cv2.waitKey(0)
    cv2.imwrite("imgs/00.jpg",img2)

    images = img2.reshape(1, 3, img2.shape[0], img2.shape[1])

    data = torch.tensor(images)
    datas = torch.tensor(images, dtype=torch.float32)

    sp=Conv()
    output=sp(datas)

    ar=output.detach().numpy()
    result=ar.reshape(img2.shape[0], img2.shape[1],3)
    print(result)

    #图片处理
    for i in range(result.shape[0]):
        for j in range(1,result.shape[1]-2):
            ss1 = result[i, j - 1:j + 2,:].mean()
            m = result[i][j].mean() - ss1
            if m >= ss1:
                print(ss1)
                img2[i][j] = 255
            else:
                img2[i][j] = 0
    img2[:, -3:] = 0
    img2[:, :3] = 0
    cv2.imshow("ss", img2)
    cv2.waitKey(0)

处理效果如下:

第一张光线比较强的图片:

                                                    原图                                   二值化图

第二张光线比较暗的图

原图                                   二值化图

        以上图片处理的方式用了BatchNorm处理和Xsilu处理,最后感觉这种效果还可以,尤其是在强光下的效果。

2.用普通的计算方法代码如下:

import numpy as np
import cv2
import time
import os


colors = [ (0, 0, 0), (128, 0, 0), (0, 128, 0), (128, 128, 0), (0, 0, 128), (128, 0, 128), (0, 128, 128),
                            (128, 128, 128), (64, 0, 0), (192, 0, 0), (64, 128, 0), (192, 128, 0), (64, 0, 128), (192, 0, 128),
                            (64, 128, 128), (192, 128, 128), (0, 64, 0), (128, 64, 0), (0, 192, 0), (128, 192, 0), (0, 64, 128),
                            (128, 64, 12)]

def cluster(points, radius=100):
    """
    points: pointcloud
    radius: max cluster range
    """
    print("................", len(points))
    items = []
    while len(points)>1:
        item = np.array([points[0]])
        base = points[0]
        points = np.delete(points, 0, 0)
        distance = (points[:,0]-base[0])**2+(points[:,1]-base[1])**2#获得距离
        infected_points = np.where(distance <= radius**2)#与base距离小于radius**2的点的坐标
        item = np.append(item, points[infected_points], axis=0)
        border_points = points[infected_points]
        points = np.delete(points, infected_points, 0)
        while len(border_points) > 0:
            border_base = border_points[0]
            border_points = np.delete(border_points, 0, 0)
            border_distance = (points[:,0]-border_base[0])**2+(points[:,1]-border_base[1])**2
            border_infected_points = np.where(border_distance <= radius**2)
            #print("/",border_infected_points)
            item = np.append(item, points[border_infected_points], axis=0)
            if len(border_infected_points)>0:
                for k in border_infected_points:
                    if points[k] not in border_points:
                        border_points=np.append(border_points,points[k], axis=0)
                #border_points = points[border_infected_points]
            points = np.delete(points, border_infected_points, 0)
        items.append(item)
    return items

#2.获得轨道的类
def railway_classes(img,x1,x2,y1,y2):


    img2 = img[x1:x2, y1:y2, :]  # [540:741, 810:1080],截取轨道画线的区域,对该区域识别轨道
    print("img2:", img2.shape)
    dst = np.zeros((img2.shape[0], img2.shape[1]), np.uint8)

    for i in range(img2.shape[0]):
        for j in range(2, img2.shape[1] - 2):
            z = img2[i, j - 2:j + 2]
            # print(z)
            a_z = np.average(z, axis=0)  # 按列求均值
            # print(a_z)
            m = abs(img2[i][j] - a_z).max()
            # print(m)
            if m > 12:
                dst[i][j] = 255
            else:
                dst[i][j] = 0
    cv2.imshow("ss", dst)
    cv2.waitKey(0)
    img2=dst

    # cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\170.jpg", img2)
    # 3.腐蚀膨胀消除轨道线外的点
    kernel = np.uint8(np.ones((5, 1)))
    # 膨胀图像.....为了使得轨道线更粗,且补足轨道线缺失的地方
    dilated = cv2.dilate(img2, kernel)

    kernel = np.ones((2, 3), np.uint8)
    dilated = cv2.erode(dilated, kernel)
    #
    ss=np.argwhere(dilated >0)#dilated
    # cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\120.jpg",dilated)
    cv2.imshow("ss", dilated)
    cv2.waitKey(0)
    #聚类算法
    t1=time.time()
    items = cluster(ss, radius=3)
    i=0
    out=[]#获得大于300个坐标的类
    for item in items:
        if len(item)>180:
            out.append(item)
            for k in item:
                img[k[0]+x1][k[1]+y1]=colors[i]
            i+=1
    t2=time.time()
    print("dbscan消耗时间:",t2-t1)
    cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\0.jpg", img)
    return out

#2.获得轨道的类
def railway_classes2(img,x1,x2,y1,y2):


    img2 = img[x1:x2, y1:y2, :]  # [540:741, 810:1080],截取轨道画线的区域,对该区域识别轨道
    print("img2:", img2.shape)
    dst = np.zeros((img2.shape[0], img2.shape[1]), np.uint8)

    for i in range(img2.shape[0]):
        for j in range(2, img2.shape[1] - 2):
            z = img2[i, j - 2:j + 2]
            # print(z)
            a_z = np.average(z, axis=0)  # 按列求均值
            # print(a_z)
            m = abs(img2[i][j] - a_z).max()
            # print(m)
            if m > 12:
                dst[i][j] = 255
            else:
                dst[i][j] = 0
    cv2.imshow("ss", dst)
    cv2.waitKey(0)
    img2=dst

    # cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\170.jpg", img2)
    # 3.腐蚀膨胀消除轨道线外的点
    kernel = np.uint8(np.ones((5, 1)))
    # 膨胀图像.....为了使得轨道线更粗,且补足轨道线缺失的地方
    dilated = cv2.dilate(img2, kernel)

    kernel = np.ones((2, 3), np.uint8)
    dilated = cv2.erode(dilated, kernel)
    #
    ss=np.argwhere(dilated >0)#dilated
    # cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\120.jpg",dilated)
    cv2.imshow("ss", dilated)
    cv2.waitKey(0)
    #聚类算法
    t1=time.time()
    items = cluster(ss, radius=3)
    i=0
    out=[]#获得大于300个坐标的类
    for item in items:
        if len(item)>80:
            out.append(item)
            for k in item:
                img[k[0]+x1][k[1]+y1]=colors[i]
            i+=1
    t2=time.time()
    print("dbscan消耗时间:",t2-t1)
    cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\0.jpg", img)
    return out




#2.获得轨道的类
def railway_classes3(img,x1,x2,y1,y2):


    img2 = img[x1:x2, y1:y2, :]  # [540:741, 810:1080],截取轨道画线的区域,对该区域识别轨道
    print("img2:", img2.shape)
    dst = np.zeros((img2.shape[0], img2.shape[1]), np.uint8)

    for i in range(img2.shape[0]):
        for j in range(2, img2.shape[1] - 2):
            z = img2[i, j - 2:j + 2]
            # print(z)
            a_z = np.average(z, axis=0)  # 按列求均值
            # print(a_z)
            m = abs(img2[i][j] - a_z).max()
            # print(m)
            if m > 11:
                dst[i][j] = 255
            else:
                dst[i][j] = 0
    cv2.imshow("ss", dst)
    cv2.waitKey(0)
    img2=dst

    # cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\170.jpg", img2)
    # # 3.腐蚀膨胀消除轨道线外的点
    kernel = np.uint8(np.ones((4, 2)))
    # 膨胀图像.....为了使得轨道线更粗,且补足轨道线缺失的地方
    dilated = cv2.dilate(img2, kernel)

    kernel = np.ones((3, 3), np.uint8)
    dilated = cv2.erode(dilated , kernel)
    # #
    # kernel = np.uint8(np.ones((5, 2)))
    # # 膨胀图像.....为了使得轨道线更粗,且补足轨道线缺失的地方
    # dilated = cv2.dilate(dilated, kernel)


    ss=np.argwhere(dilated >0)#dilated
    # cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\120.jpg",dilated)
    cv2.imshow("ss", dilated)
    cv2.waitKey(0)
    #聚类算法
    t1=time.time()
    items = cluster(ss, radius=3)
    i=0
    out=[]#获得大于300个坐标的类
    for item in items:
        if len(item)>80:
            out.append(item)
            for k in item:
                img[k[0]+x1][k[1]+y1]=colors[i]
            i+=1
    t2=time.time()
    print("dbscan消耗时间:",t2-t1)
    cv2.imwrite("D:\AI\project\eye_hand_biaoding\\railways\dbscan\img\\0.jpg", img)
    return out


#以15个左右的像素点,将类每个类分为很多个小类画直线
def fenlei(classes,num):
    class_mean=[]

    for item in classes:
        item_classes=[]

        #获取初始点的值
        hh=item[:5]
        y=hh[0][0]
        x=int(hh[:,-1:].mean())
        item_classes.append((x, y))
        item =item[item[:,0].argsort()]

        #对数据分成很多个段,再
        while len(item) > num+15:

            items=item[:num]
            s1=items
            y10=int(s1[:, :1].mean())
            x10=int(s1[:,-1:].mean())
            item_classes.append((x10,y10))
            item=item[120:]
        if len(item)>5:
            s1 = item
            y10 = int(s1[:, :1].mean())
            x10 = int(s1[:, -1:].mean())
            item_classes.append((x10, y10))

        class_mean.append(item_classes)

    all_k=[]
    for item in class_mean:
        k_b=[]
        for i in range(len(item)-1):
            x10,y10=item[i][0],item[i][1]
            x20, y20 = item[i+1][0], item[i+1][1]
            k1=(y10-y20)/(x10-x20+0.00001)
            b1=y10-k1*x10
            k_b.append((k1, b1, [y10,y20]))
        all_k.append(k_b)
    print(all_k)
    return all_k

#画线
def draw_line(img,all_k,x1,x2,y1,y2):
    print("......................画直线.............................")
    for k_b in all_k:
        ss=np.array(k_b)
        ks=np.array(ss[:,:1]/len(ss)).sum()*0.5
        #print(ks)
        for i in range(len(k_b)):
            k, b, (y10, y20) = k_b[i]
            x10 = int((y10 - b) / (k+0.000001))
            x20 = int((y20 - b) / (k+0.000001))
            cv2.line(img, (x10 + y1, y10 + x1), (x20 + y1, y20 + x1), (0, 0, 255), 2)

    cv2.imshow("line_detect_possible_demo", img)
    cv2.waitKey(0)



if __name__ == '__main__':

    start=time.time()
    img_paths = r"imgs\000004.jpg"
    save_paths = r"imgs\20.jpg"

    img = cv2.imread(img_paths)

    img2=img.copy()

    all_class = {}
    all_class["1"] = []
    all_class["2"] = []


    # 第1次*************************************************************************************
    #获得轨道的类
    classes=railway_classes(img,  x1=680, x2=740, y1=825, y2=1045)#

    # 求第一段的类
    all_class["1"].append(classes[0])
    all_class["2"].append(classes[1])

    start1 = classes[0][:20, 1:].mean() + 825
    start2 = classes[1][:20, 1:].mean() + 825
    print(start1, start2)

    #=============================================================================================================
    # classes2 = railway_classes2(img, x1=640, x2=680, y1=845, y2=995)  #
    # print("......................................................")
    # # 求第一段的类
    # for item in classes2:
    #     # print("start===>",item[:20,1:].mean()+845)
    #     # print("end===>",item[-20:,1:].mean()+845)
    #     if abs((item[-20:, 1:].mean() + 845) - start1) < 10:
    #         np.vstack((all_class["1"][0], item))
    #         start1 = item[:20, 1:].mean() + 845
    #     elif abs((item[-20:, 1:].mean() + 845) - start2) < 10:
    #         np.vstack((all_class["2"][0], item))
    #         start2 = item[:20, 1:].mean() + 845
    # print(start1, start2)
    #
    # # =============================================================================================================
    # classes3 = railway_classes3(img, x1=610, x2=640, y1=855, y2=965)  #
    # print("......................................................")
    # for item in classes3:
    #     # print("start===>",item[:,1:].mean()+855)
    #     # print("end===>", item[-20:, 1:].mean() + 855)
    #     if abs((item[-20:, 1:].mean() + 855) - start1) < 10:
    #         np.vstack((all_class["1"][0], item))
    #         start1 = item[:20, 1:].mean() + 855
    #     elif abs((item[-20:, 1:].mean() + 855) - start2) < 10:
    #         np.vstack((all_class["2"][0], item))
    #         start2 = item[:20, 1:].mean() + 855
    # print(start1, start2)

    ss=[]
    ss.append(all_class["1"][0])
    ss.append(all_class["2"][0])
    print(ss[0])


    # 以15个左右的像素点,将类每个类分为很多个小类画直线
    num=100
    all_k=fenlei(ss,num)#classes
    #
    # # 画线
    draw_line(img, all_k, x1=680, x2=740, y1=825, y2=1035)#


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1494156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Flink入门修炼】2-2 Flink State 状态

什么是状态&#xff1f;状态有什么作用&#xff1f;如果你来设计&#xff0c;对于一个流式服务&#xff0c;如何根据不断输入的数据计算呢&#xff1f;又如何做故障恢复呢&#xff1f; 一、为什么要管理状态 流计算不像批计算&#xff0c;数据是持续流入的&#xff0c;而不是…

iOS小技能:苹果开发者申请材料

文章目录 引言I 个人账号申请资料II 公司账号申请所需资料III duns资料提交操作步骤IV 续费引言 https://developer.apple.com/cn/programs/enroll/ 申请过程只能使用同一台设备注册苹果开发者的Apple ID可以转让。注册苹果开发者的在验证身份证信息的时候,必须使用法定姓名拼…

STM32(18)I2C

串口通信缺点 一个设备就需要一个串口&#xff0c;单片机可能没有那么多串口外设 总线/非总线 主机&#xff1a;负责管理总线&#xff0c;可控制波特率、数据的通信方向 波特率&#xff1a;由主机产生波特率信号 数据的传输 每个从机都有7位地址&#xff0c;最后移位是读&a…

3.6IO作业

编写一个伪终端 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <wait.h> void getstring(char* buf,int si…

STM32CubeMX学习笔记12 ---低功耗模式

在实际使用中很多产品都需要考虑低功耗的问题&#xff0c;STM32F10X提供了三种低功耗模式&#xff1a;睡眠模式&#xff08;Sleep mode&#xff09;、停机模式&#xff08;Stop mode&#xff09;和待机模式&#xff08;Standby mode&#xff09;。这些低功耗模式可以有效减少系…

浅谈电子商务企业跨境电商经常要用到的电商API接口接入说明和参数解析

开发电商平台就一定离不开接口&#xff0c;作为产品经理&#xff0c;我们要对接口不要求能实现调用。但要知道接口是什么&#xff0c;有什么用&#xff0c;有哪些要素。 什么是API吗&#xff1f; API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口…

Linux上轻松搞定Docker环境下Nginx安装

Nginx安装 下载Nginx1.10的docker镜像&#xff1a; docker pull nginx:1.10先运行一次容器&#xff08;为了拷贝配置文件&#xff09;&#xff1a; docker run -p 80:80 --name nginx -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/logs:/var/log/nginx -d…

5. 链接和加载(linker and loader)

链接和加载(linker and loader)&#xff1a; linker即链接器&#xff0c;它负责将多个.c编译生成的.o文件&#xff0c;链接成一个可执行文件或者是库文件&#xff1b; loader即加载器&#xff0c;它原本的功能很单一只是将可执行文件的段拷贝到编译确定的内存地址即可&#x…

数据库:创建员工表,实现对员工的管理(增、删、改、查)

#include <myhead.h> int do_add(sqlite3 *ppdb) {int numb;char name[20];double salary;printf("请输入员工信息&#xff1a;numb name salary\n");printf("请输入工号>>>");scanf("%d",&numb);printf("请输入员工姓名…

技术型项目经理和管理型项目经理有何区别?

在项目管理领域中&#xff0c;项目管理岗位涵盖了两种不同职责的角色&#xff0c;即技术型项目经理和管理型项目经理。这两个角色在职责、技能和关注点上存在一定的差异。 技术型项目经理 技术型项目经理通常具备广泛的专业知识和技术背景&#xff0c;他们关注项目的具体技术实…

Win11 24H2什么时候发布-你期待哪些新功能?

Win11 24H2什么时候发布&#xff1f;Win11 24H2的发布日期终于有了确切的消息。微软官方已宣布&#xff0c;这款备受期待的重要更新将在2024年下半年与大家见面。24H2版本的推出无疑将为广大用户带来更加流畅、安全和易用的操作系统体验。接下来跟随小编去看看这个新版本带来哪…

Android使用OpenGL和FreeType绘制文字

Open GL主要是渲染图形的&#xff0c;有时候需要绘制文字&#xff0c;网上搜了一下&#xff0c;基本思路都是把文字转成位图&#xff0c;再使用Open GL纹理进行渲染。加载纹理在特定阶段才能成功&#xff08;在onSurfaceCreated中加载&#xff09;&#xff0c;这样就无法动态的…

Cocos Creator 3.8.x 制作模糊效果(比如游戏弹窗需要的模糊效果)

接着上一个讨论的话题,关于3.8.x的后效,今天来分享自定义后效来制作模糊效果,并将他应用到弹窗中做背景,话不多说开整。 一:最终效果 首先咱们来看官网自定义后效怎么搞的,从它的实例开始:自定义后效 二:定义PostProcessSettings给节点提供资源(通过编辑器修改参数的…

【JavaScript】Map、Reduce 和 Filter - 通过代码示例解释 JS 数组函数

Map、reduce 和 filter 都是 JavaScript 中的数组方法。每个都将迭代一个数组并执行转换或计算。每个函数都会根据函数的结果返回一个新数组。在本文中&#xff0c;您将了解为什么以及如何使用每一个。 以下是 Steven Luscher 的有趣总结&#xff1a; Map map()方法用于从现…

抖音开店实操步骤,图文详解!

大家好&#xff0c;我是电商糖果 话不多说&#xff0c;最近准备在抖音开店的朋友&#xff0c;这份图文开店笔记&#xff0c;记得收藏&#xff01; 一、开店前的准备 1. 营业执照 执照最好选个体的&#xff0c;个体执照可以直接去工商局办理&#xff0c;也可以找专业的代办。…

2024/3/5打卡最长上升子序列**----线性DP,贪心,单调栈

目录 题目&#xff1a; DP分析&#xff1a; 代码&#xff1a; 3.6更新 贪心 第一个思考方式 先上代码&#xff1a; 解析&#xff1a; 贪心 第二个思考方式 &#xff08;与上面的思路差不多&#xff0c;但是换了个角度&#xff09; 思路&#xff1a; 代码&#xff1a; …

探索神经网络在商品销售和图像识别中的应用

目录 前言人工神经网络简介1.1 人工神经网络与深度学习简介1.2 生物神经元结构与神经元机器模型1.3 神经网络的数据量与性能关系 2 需求预测2.1 需求预测的背景2.2 商品销售神经元机器模型2.3 多层神经网络结构的优势 3 图像识别3.1 图像识别神经网络技术3.2 实际应用场景 结语…

AI领域再出“王炸“----Claude3是否会成为下一个“神“

目录 一.Claude3最新发布 二.Claude3支持20万token 三.Claude3在未公开算法上取得重大突破 1.Claude 3读懂博士论文 2.量子跃迁集成&#xff1a; Claude 3智商&#xff1a;101 测试方法 测试细节 通过Karpathy挑战 Claude 3自画像&#xff0c;突破本我 从洛杉矶排到…

3_1储能容量配置

% 创建优化问题 problem optimproblem(ObjectiveSense, minimize);% 定义变量 x optimvar(x, 2, 1, LowerBound, 0); % 储能设备容量变量% 定义目标函数 problem.Objective 2*x(1) 3*x(2); % 假设成本函数为2*x1 3*x2% 定义约束条件 problem.Constraints.capacity1 x(1) …

01-环境搭建、SpringCloud微服务(注册发现、服务调用、网关)

环境搭建、SpringCloud微服务(注册发现、服务调用、网关) 1)课程对比 2)项目概述 2.1)能让你收获什么 2.2)项目课程大纲 2.3)项目概述 随着智能手机的普及&#xff0c;人们更加习惯于通过手机来看新闻。由于生活节奏的加快&#xff0c;很多人只能利用碎片时间来获取信息&…