16 直线识别拟合角平分线(matlab程序)

news2024/11/19 13:18:09

1.简述

      

  • 直线检测是数字图像处理的重要内容,在道路识别,建筑物识别,医学图像分析等领域都有十分重要的应用。通过对已经获得的图像进行边缘检测,然后用Hough变换对边缘检测进行直线检测。该方法简单,受直线中的间隙和噪声影响较小。在Matlab环境下对该方法进行了仿真实验,并对图像中直线目标进行了检测,结果表明用该方法对图像中直线目标进行检测是快速有效的。​

2.代码

 

function chengxu()
%%  第1步
close all
I=imread('1.jpg');  %读取图像
I=rgb2gray(I);     %彩色图像转换成灰度图
I=edge(double(I)); %检测图像的边缘
figure
imshow(I)          %显示边缘检测的结果

%%  第2步

[m,n]=size(I);     %计算图像的尺寸

M=3;             %定义X方向分割的块数
N=3;             %定义Y方向分割的块数
mm=floor(m/M);   %子块行的长度
nn=floor(n/N);   %子块列的长度
count=1;         %计数器
figure
for i=1:M
    for j=1:N
        A=I((i-1)*mm+1:i*mm,(j-1)*nn+1:j*nn);    %分割原图像,得到一个子块
        subplot(M,N,count)      
        imshow(A)                             %显示一个子块
        zuoshangjiao=[(i-1)*mm+1 (j-1)*nn+1];  %子块左上角的坐标
        [x,y,k,b]=zikuai(A,zuoshangjiao);%得到子块里白色像素点拟合得到的直线的斜率k和截距b(调用zikuai函数)
        X{count}=x;       %保存子块里所有白色像素的x坐标
        Y{count}=y;       %保存子块里所有白色像素的y坐标
        K(count)=k;       %保存子块里拟合得到的直线的斜率k
        B(count)=b;       %保存子块里拟合得到的直线的截距b
        count=count+1;    %计数器加1,进行下一个子块的计算
    end
end

%%  第3步

KK=K(~isnan(K));   %去掉K中的NaN(白色像素点少于10的子块)
BB=B(~isnan(B));   %去掉B中的NaN(白色像素点少于10的子块)

mean_K=mean(KK);   %求所有斜率的平均值
mean_B=mean(BB);   %求所有截距的平均值

figure
subplot(2,1,1)
plot(KK,'-o')
title('各子块拟合得到的直线k值')
subplot(2,1,2)
plot(BB,'-o')
title('各子块拟合得到的直线b值')

count1=1;
count2=1;
for i=1:length(K)
    if ~isnan(K(i))
        if K(i)>mean_K   %大于斜率平均值的子块,将这些子块的白色像素点位置集合到cell型数组X1和Y1(分别存x和y)
            X1{count1}=X{i};
            Y1{count1}=Y{i};
            count1=count1+1;
        else    %小于斜率平均值的子块,将这些子块的白色像素点位置集合到cell型数组X2和Y2(分别存x和y)
            X2{count2}=X{i};
            Y2{count2}=Y{i};
            count2=count2+1;
        end
    end
end

XX1=[];
YY1=[];
XX2=[];
YY2=[];

for i=1:length(X1)     %大于斜率平均值的子块,将这些子块的白色像素点位置集合到double型数组里,方便计算
    XX1=[XX1;X1{i}];
    YY1=[YY1;Y1{i}];
end

for i=1:length(X2)         %小于斜率平均值的子块,将这些子块的白色像素点位置集合到double型数组里,方便计算
    XX2=[XX2;X2{i}];
    YY2=[YY2;Y2{i}];
end

%% 直线1和直线2被从图像里提取出来了分别为XX1,YY1和XX2,YY2
%%   离散点拟合得到直线1的斜率k1和截距b1
A1=[XX1,ones(length(XX1),1)];
kb1=A1\YY1;
k1=kb1(1);
b1=kb1(2);
            
%%   离散点拟合得到直线2的斜率k2和截距b2
A2=[XX2,ones(length(XX2),1)];
kb2=A2\YY2;
k2=kb2(1);
b2=kb2(2);

xx0=[1 m];
yy0=[1 n];

yy1=k1*xx0+b1;  %得到直线1上的两点,以便绘制直线1
yy2=k2*xx0+b2;  %得到直线3上的两点,以便绘制直线2

%%   绘制拟合得到的直线和分离出来的离散点
%%  直线1
figure
axis([1,m,1,n])    %设定显示范围
hold on
scatter(XX1,YY1,'LineWidth',5)   %绘制直线1对应的白色像素位置
plot(xx0,yy1,'r','LineWidth',3)  %绘制拟合到的直线1

%%  直线2
hold on
scatter(XX2,YY2,'k','LineWidth',5)  %绘制直线2对应的白色像素位置
plot(xx0,yy2,'y','LineWidth',3)     %绘制拟合到的直线2

%%   第4步

%%   求两条直线的交点
X0=(b2-b1)/(k1-k2);
Y0=k1*X0+b1;

alpha=atan(k1);    %直线1与x夹角
beta=atan(k2);     %直线2与x夹角

K01=tan((alpha+beta)/2);        %角平分线1的斜率
K02=tan(-pi/2+(alpha+beta)/2);  %角平分线2的斜率

B01=Y0-K01*X0;   %角平分线1的截距
B02=Y0-K02*X0;   %角平分线2的截距

%%  绘制角平分线
xx0=[1 m];
yy0=[1 n];

YY1=K01*xx0+B01;  %角平分线1
YY2=K02*xx0+B02;  %角平分线2
plot(xx0,YY1);    %绘制角平分线1
plot(xx0,YY2);    %绘制角平分线2

view([90 90])
end

function [x,y,k,b]=zikuai(feikuai,zuoshangjiao)
%%   求每个子块数据拟合出来的直线y=kx+b,返回k和b,以及子块里白色像素点的坐标
x0=zuoshangjiao(1);     %得到子块的左上角x坐标
y0=zuoshangjiao(2);     %得到子块的左上角y坐标

[m,n]=size(feikuai);    %计算子块的大小
N=1;                    %N从1开始计数
x=[];                   %定义子块白色像素x坐标保存的向量x
y=[];                   %定义子块白色像素y坐标保存的向量y
for i=1:m               %依次扫描子块各个点的像素值
    for j=1:n
        if feikuai(i,j)==1  %如果是白色像素,保存该像素的坐标
            x(N)=i;     %保存相对坐标(x方向)
            y(N)=j;     %保存相对坐标(y方向)
            N=N+1;      %计数加1,判断下一个像素
        end
    end
end

if length(x)<10   %少于10个白色像素的子块(包括没有白点的子块),舍弃掉(点数太少,可能是噪声)
    k=NaN;        %将k b x y 赋值NaN(Matlab系统变量,表示Not a Number),以示与其他子块的区别
    b=NaN;
    x=NaN;
    y=NaN;
    return       %返回
else             %子块白色像素点个数大于等于10,对白色像素点的坐标进行拟合,得到直线的斜率k和截距b
    x=x+x0;      %得到子块内白色像素点相对于原图像的绝对坐标x
    y=y+y0;      %得到子块内白色像素点相对于原图像的绝对坐标y
    x=x';
    A=[x,ones(length(x),1)];    %定义矩阵A(直线拟合就是解超越线性方程组的最小二乘解,未知数为k和b)即A*[k;b]=y';
    y=y';
    kb=A\y;                     %得到最小二乘解,对应k和b     
    k=kb(1);                    %得到k
    b=kb(2);                    %得到b
end
end

 

3.运行结果

eb24f3be2a754b99932763c61396ffd2.png

7b725569944249f5a4378b36b0b14211.png 

 26d17b1d03a3478693dcba0ff551c700.png

 2259f67a4b3a479693f83088622cb040.png

 588491549e7b4a3981a1817d81d50040.png

 

 

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

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

相关文章

【LLM】Windows本地CPU部署民间版中文羊驼模型(Chinese-LLaMA-Alpaca)踩坑记录

目录 前言 准备工作 Git Python3.9 Cmake 下载模型 合并模型 部署模型 前言 想必有小伙伴也想跟我一样体验下部署大语言模型, 但碍于经济实力, 不过民间上出现了大量的量化模型, 我们平民也能体验体验啦~, 该模型可以在笔记本电脑上部署, 确保你电脑至少有16G运行…

1.4 计算机网络性能

1.4 计算机网络性能 速率带宽延迟/时延(delay或latency)四种分组延迟排队延迟 时延带宽积分组丢失&#xff08;丢包&#xff09;吞吐量/率&#xff08;Throughput&#xff09; 速率 速率即数据率(data rate)或称数据传输速率或比特率(bit rate) 单位时间&#xff08;秒&#x…

为什么我心中TOP1的编程语言是Java?我为什么选择Java?

文章目录 前言优点跨平台性面向对象编程&#xff08;OOP&#xff09;强大的类库和工具支持广泛的应用领域 缺点速度相对较慢内存消耗较大较高的学习曲线 Java 学习路线总结前置知识Web前端基础 后端基础1. Java基础2. 数据库技术3. Web开发技术4. 框架技术5. 服务器部署 其他技…

KKT条件

有两种情况&#xff1a; 原问题是非凸函数原问题是凸函数 &#xff08;1&#xff09;非凸函数 KKT是强对偶的必要条件&#xff0c;而不是充分条件&#xff0c;即KKT不能推出强对偶。 &#xff08;2&#xff09;凸函数 KKT与强对偶互为充要条件。 下面给出具体的KKT条件&a…

数据结构--二叉树的先中后序遍历

数据结构–二叉树的先中后序遍历 二叉树的遍历 层次遍历 层次遍历:基于树的层次特性确定的次序规则 二叉树的递归特性: ①要么是个空二叉树 ②要么就是由“根节点左子树右子树”组成的二叉树 先 \color{red}先 先序遍历&#xff1a; 根 \color{red}根 根左右&#xff08; N \…

springboot 集成log4j日志,需要自定义json格式内容输出方便ES采集

背景 公司需要将服务迁移到K8S环境上&#xff0c;由于目前服务输出的格式不符合ES进行采集的日志格式&#xff0c;所有需要将日志输出的格式进行调整为JSON格式&#xff0c;方便ES采集 遇到的坑 之前是直接配置的输出格式的message为"message": %msg"&#x…

记录一下,linux安装环境步骤。

前文 鉴于之前都是下载压缩包方式安装环境&#xff0c;学习了docker之后&#xff0c;决定将服务器初始化&#xff0c;重新用docker安装相应环境 条件&#xff1a;自己买的阿里云centos系统。单核系统&#xff0c;仅学习使用。 初始化云盘 初始化云盘步骤&#xff1a; 1&…

Perfetto 命令行工具(Android 10 及更高版本)

Perfetto 命令行工具&#xff08;Android 10 及更高版本&#xff09; 1、快速入门1.1 启动跟踪服务1.2 记录跟踪1.2.1 通过 Perfetto UI 记录跟踪1.2.2 通过 cmdline 记录跟踪1.2.3 System Tracing 的系统级应用抓取 2、perfetto 工具2.1 数据源选择2.2 语法参数2.2.1 轻量模式…

数据结构--树和二叉树

目录 1.树的结构及概念1.1树的概念1.2树的相关概念1.3树的表示1.4树在实际中的运用&#xff08;表示文件系统的目录结构&#xff09; 2.二叉树的相关概念2.1概念2.2现实版的二叉树2.3特殊的二叉树2.4二叉树的性质2.5二叉树的存储结构 3.与二叉树有关的习题总结 1.树的结构及概念…

RabbitMQ系列(14)--Topics交换机的简介与实现

1、Topics交换机的介绍 Topics交换机能让消息只发送往绑定了指定routingkey的队列中去&#xff0c;不同于Direct交换机的是&#xff0c;Topics能把一个消息往多个不同的队列发送&#xff1b;Topics交换机的routingkey不能随意写&#xff0c;必须是一个单词列表&#xff0c;并以…

leetcode极速复习版-第三章哈希表

目录 哈希表 哈希表理论基础 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和 454.四数相加II 383. 赎金信 15. 三数之和 18. 四数之和 哈希表 哈希表理论基础 那么哈希表能解决什么问题呢&#xff0c;一般哈希表都是用来快速判断一个元素是否出…

机器人制作开源方案 | 卧式车床模型概述

1. 功能说明 本文示例将通过程序控制模拟车床的运动效果--模拟车床进行加工时各个结构的运动方式。车床的主要运动包括夹持工件主轴的旋转运动、刀具进给运动、刀具的换刀旋转运动、溜板的平动、尾座上顶针的进给运动。 2. 结构说明 该车床主轴旋转运动选择带传动的传动方式&am…

Elasticsearch实战(二十四)---ES数据建模一对多模型Nested结构

Elasticsearch实战—ES数据建模一对多模型Nested结构 文章目录 Elasticsearch实战---ES数据建模一对多模型Nested结构1.ES 一对多模型Nested 结构模型实战2.ES字段查询2.1 非Nested 错误结构及错误查询2.2 Nested结构&#xff0c;正确查询 3.Nested结构原理 我们如何把Mysql的模…

vue 中使用 vxe-table 制作可编辑表格

项目上有一个表格需要实现在线编辑&#xff0c;开始用了 element 的el-table 实现&#xff0c;单元格内基础情况就是监听了单击单元格切换一个span标签与input标签&#xff0c;复杂点的单元格使用了大量的条件判断来实现对应的编辑操作&#xff0c;比如下拉选&#xff0c;popov…

github Couldn‘t connect to server

Couldnt connect to server 问题描述解决git clone 出错直接访问github没啥问题ping github.com手动指定域名映射关系再次测试git命令 总结参考 问题描述 前一天还是好好的&#xff0c;能git pull和git push&#xff0c;昨天回来之后怎么操作都是Couldnt connect to server。百…

【数据结构】堆的实现(向下调整和向上调整法)和堆排序的实现

目录 一、堆的概念引入 二、小堆的实现 首先&#xff0c;我们会跟线性表一样建立一个动态数组来存堆的数据 ①、堆的初始化--HeapInit ②、小堆的向下调整法的实现 ③、堆排序的实现 ④、堆的插入和向上调整法 ⑤、删除堆顶数据 ⑥、获取堆顶 三、时间复杂度总结&#…

C# PaddleInference OCR识别 学习研究Demo

说明 基于开源项目 https://github.com/sdcb/PaddleSharp VS2022.net4.8 OpenCvSharp4Sdcb.PaddleInference 效果 项目 代码 using Sdcb.PaddleInference.Native; using Sdcb.PaddleInference; using System; using System.Collections.Generic; using OpenCvSharp.Extensi…

15年前的手机并没有jvm虚拟机,为何可以运行Java游戏

2000年代初期&#xff0c;随着移动通信技术的发展&#xff0c;手机逐渐普及。那个时代的手机功能相对比较单一&#xff0c;主要用于打电话和发送短信。但是&#xff0c;随着技术的进步&#xff0c;人们开始在手机上玩游戏&#xff0c;而其中最受欢迎的游戏就是Java游戏。在那个…

ChatLaw,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 最近这段时间&#xff0c;AI 的整体热度有所下降&#xff0c;但是 AI 技术在各行各业的探索脚步&#xff0c;却一直没有停止。 在 ChatGPT 刚发布时&#xff0c;有不少业内人士认为&#x…

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别

【浏览器篇】记录下浏览器保存PDF文件不同方式的小区别 以前不太注意这些&#xff0c;最近搞文档比较多才发现为何保存的一部分PDF文件里面字体可以复制可以搜索&#xff0c;一部分保存的PDF里面的字体却无法复制、无法搜索等&#xff0c;发现是不同保存方式得到的文档权限不一…