【matlab】:matlab关于原图修改及画图的相关问题

这是一个比较难搞定的问题,详细请看下图:

这儿有七个点,我想把这七个点排序,然后连线,实现下面的效果:

这怎么实现的呢?先写步骤然后上代码:

1,先识别多个点的质心

2,通过质心进行连线和画点操作

//题外话,关于连线和画点操作是如何做到的呢,这是通过对原图的数据进行修改做到的

直接给出代码,还有图片保存在代码里的路径下用matlab运行就能使

I=imread(‘d:\\自行车测试1.jpg‘);%读取原图像
%figure(1);imshow(I);%显示原图像

I_gray=rgb2gray(I);%原图像变为灰度图像
level=graythresh(I_gray);%计算图像I_gray的全局阈值,level为标准化灰度值,其范围为[0 1]
[height,width]=size(I_gray);%计算灰度图像的长宽
I_bw=im2bw(I_gray,level);%im2bw使用阈值level将灰度图像转换为二值图像.
%figure(2);imshow(I_bw);%显示二值图像(背景为白色)

for i=1:height %%循环中进行反色
    for j=1:width
        if I_bw(i,j)==1
            I_bw(i,j)=0;
        else I_bw(i,j)=1;
        end
    end
end
%figure(3);imshow(I_bw);%显示取反后的二值图像(背景为黑色)

[L,num]=bwlabel(I_bw,8);%bwlabel标注二值图像I_bw中的目标物体,返回标识矩阵L和I_bw中目标物体的数量num,8表示连通数.
plot_x=zeros(1,num);%%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的横坐标
plot_y=zeros(1,num);%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的纵坐标
plot_z=zeros(1,num);%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的纵坐标
poly_x=zeros(1,num);%%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的横坐标
poly_y=zeros(1,num);%zeros(m,n)产生m×n的全0矩阵.用于记录质心位置的纵坐标

for i=1:num
    plot_z(i) = 1;
end

for k=1:num  %%num个区域依次统计质心位置
    sum_x=0;    sum_y=0;    area=0; %初始化
    for i=1:height
        for j=1:width
            if L(i,j)==k
                sum_x=sum_x+i;  %计算第K区域的横坐标总和
                sum_y=sum_y+j;  %计算第K区域的纵坐标总和
                area=area+1;    %计算第K区域的由多少个坐标点表示
            end
        end
    end
    plot_x(k)=fix(sum_x/area);  %计算第K区域的质心横坐标
    plot_y(k)=fix(sum_y/area);%计算第K区域的质心纵坐标
end

%第一步
max_x = 0;pos = 0;
for i = 1:num
    if plot_y(i)>max_x
    pos = i;
        max_x = plot_y(i);
    end
end
poly_x(1) = plot_x(pos);
poly_y(1) = plot_y(pos);
plot_z(pos) = 0;

%第二步
min_y = 9999999;
pos = 0;
for i=1:num
    if plot_x(i)<min_y
        pos = i;
        min_y = plot_x(i);
    end
end
poly_x(3) = plot_x(pos);
poly_y(3) = plot_y(pos);
plot_z(pos) = 0;

%第四步
min_y = 9999999999;pos = 0;
for i=1:num
    if plot_z(i)==1
        if plot_x(i)<min_y
            pos = i;
            min_y = plot_x(i);
        end
    end
end
poly_x(2) = plot_x(pos);
poly_y(2) = plot_y(pos);
plot_z(pos) = 0;

%第五步
min_y = 9999999999;pos = 0;
for i=1:num
    if plot_z(i)==1
        if plot_x(i)<min_y
            pos = i;
            min_y = plot_x(i);
        end
    end
end
poly_x(5) = plot_x(pos);
poly_y(5) = plot_y(pos);
plot_z(pos) = 0;

%找第三个点
min_y = 9999999999;pos = 0;
for i=1:num
    if plot_z(i)==1
        if plot_x(i)<min_y
            pos = i;
            min_y = plot_x(i);
        end
    end
end
poly_x(4) = plot_x(pos);
poly_y(4) = plot_y(pos);
plot_z(pos) = 0;

%第三个点和第四个点的局部信息解决
if poly_y(4) > poly_y(5)
    temp_x = poly_x(4);
    temp_y = poly_y(4);
    poly_x(4) = poly_x(5);
    poly_y(4) = poly_y(5);
    poly_x(5) = temp_x;
    poly_y(5) = temp_y;
end

%第六步
max_x = 0;pos = 0;
for i=1:num
    if plot_z(i)==1
        if plot_y(i)>max_x
            pos = i;
            max_x = plot_y(i);
        end
    end
end
poly_x(8) = plot_x(pos);
poly_y(8) = plot_y(pos);
plot_z(pos) = 0;

%第七步

min_y = 9999999999;pos = 0;
for i=1:num
    if plot_z(i)==1
        if plot_x(i)<min_y
            pos = i;
            min_y = plot_x(i);
        end
    end
end
poly_x(6) = plot_x(pos);
poly_y(6) = plot_y(pos);
plot_z(pos) = 0;

%第八步
for i=1:num
    if plot_z(i)==1
        poly_x(7) = plot_x(i);
        poly_y(7) = plot_y(i);
        break;
    end
end

%figure(4);imshow(I_bw);%显示取反后的二值图像(背景为黑色),并在图上标注质心点位置
for i=1:num
   I((plot_x(i)-20):(plot_x(i)+20),(plot_y(i)-20):(plot_y(i)+20),1) = 37;   %绿色
   I((plot_x(i)-20):(plot_x(i)+20),(plot_y(i)-20):(plot_y(i)+20),2) = 230;
   I((plot_x(i)-20):(plot_x(i)+20),(plot_y(i)-20):(plot_y(i)+20),3) = 191;
end
for i=1:num-1
   x1 = poly_x(i);
   y1 = poly_y(i);
   x2 = poly_x(i+1);
   y2 = poly_y(i+1);
   k = (y2-y1)/(x2-x1);
   if x1>x2
        t = x1;
        x1 = x2;
        x2 = t;
        temp = y1;
        y1 = y2;
        y2 =temp;
   end
   for x = x1:x2
    y = k*(x-x1)+y1;
    y = round(y);
    for j=1:6*abs(fix(k)+1)
        t =y-5+j;
        I(x,t,1) = 214;
        %I(x,y,1) = 214;
        I(x,t,2) = 69;
        %I(x,y,2) = 69;
        I(x,t,3) = 17;
        %I(x,y,3) = 17;
    end

   end
end
时间: 2024-10-17 13:03:44

【matlab】:matlab关于原图修改及画图的相关问题的相关文章

【转】linux查看及修改文件权限以及相关

linux查看及修改文件权限以及相关 查看文件权限的语句: 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是类型 中间那三个 rw- 代表的是所有者(user) 然后那三个 rw- 代表的是组群(group) 最后那三个 r-- 代表的是其他人(other) 然后我再解释一下后面那9位数: r 表示文件可以被读(read) w 表示文件可以被写(write) x

linux查看及修改文件权限以及相关

linux查看及修改文件权限以及相关 查看文件权限的语句: 在终端输入: ls -l xxx.xxx (xxx.xxx是文件名) 那么就会出现相类似的信息,主要都是这些: -rw-rw-r-- 一共有10位数 其中: 最前面那个 - 代表的是类型 中间那三个 rw- 代表的是所有者(user) 然后那三个 rw- 代表的是组群(group) 最后那三个 r-- 代表的是其他人(other) 然后我再解释一下后面那9位数: r 表示文件可以被读(read) w 表示文件可以被写(write) x

Matlab随笔(1)之画图函数总结

MATLAB函数画图 MATLAB不但擅长於矩阵相关的数值运算,也适合用在各种科学目视表示(Scientific visualization).本节将介绍MATLAB基本xy平面及xyz空间的各项绘图命令,包含一维曲线及二维曲面的绘制.列印及存档. 基本XY平面绘图命令 Plot 是绘制一维曲线的基本函数,但在使用此函数之前,我们需先定义曲线上每一点的x及y座标.下例可画出一条正弦曲线: close all; %linspace(5,100,20)和5:5:100的区别在于前者已知元素总个数而不

MATLAB——matlab特殊符号表【转载】

链接来源: matlab特殊符号表 http://blog.sina.com.cn/s/blog_4a09187801014xg9.html Character Sequence Symbol Character Sequence Symbol Character Sequence Symbol \alpha α \upsilon υ \sim ~ \beta β \phi Φ \leq ≤ \gamma γ \chi χ \infty ∞ \delta δ \psi ψ \clubsuit ♣

[Matlab]Matlab安装及破解(MATLAB 2016b)

这两天为完成最优化大作业,zyy又开始鼓捣matlab了.之前我装的是matlab 2013a,发现不支持求解整数规划,遂更新了一下. 下载地址 http://bbs.pinggu.org/thread-4841317-1-1.html这里有一个网盘地址,把破解文件和镜像文件都下载下来(这里的镜像文件被分成了两个,把下面三个文件都下载下来). 安装过程 将两个镜像文件解压到一个文件夹,我把它命名为R2016b_win64 将破解包解压 安装跟下面这个经验大同小异,不过在最开始的时候写的码在破解包

基于Matlab中FDATool工具箱的滤波器设计及相关文件的生成

一.摘要 除了采用编程的方法实现滤波器之外,Mat l ab中自带工具箱FDATool 也能很方便快速的实现滤波器的设计.另外FPGA.DS P等实现数字滤波器算法时,经常要用到滤波器系数,采用FDATool 工具箱也能快速的得到滤波器系数.二.实验平台 Matlab7.1三.实现步骤3.1 滤波器指标若需要设计一个16阶的FIR滤波器(h(0)=0),给定的参数如下:(1) 低通滤波器(2) 采样频率Fs 为48kHz ,滤波器Fc为10.8kHz(3) 输入序列位宽为9位(最高位为符号位)在

[Matlab] matlab与C/C++混合编程汇总

matlab 与外部程序的编程接口两大类: 一是 如何在matlab里调用其他语言写的代码. (见例子:使用C-MEX技术,ActiveX技术) 二是 如何在其他语言里调用matlab. (见 使用matlab引擎, MAT数据交换, matlab发布com组件, DeployTool) matlab接口技术包含以下几个方面: 1. 数据导入导出,主要是MAT文件数据的导入导出. 2.普通的动态链接库dll文件的交互,Matlab6.5起,直接matlab环境中调用dll文件导出的函数. 3.m

sqlserver表、视图、索引(创建、修改、删除)相关示例

一.表相关 1.创建 USE [test] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[Ceshi]( [id] [int] NOT NULL, [name] [varchar(30)] NULL,  CONSTRAINT [PK_Ceshi] PRIMARY KEY CLUSTERED  ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMP

使用ueditor时候修改图片路径及其相关信息

ueditor功能比较强大  使用也比较方便 但是有一些东西是需要我们自己根据实际情况去设置的 以下是关于图片/涂鸦/视频等上传信息的更改: 首先我们要找到配置文件config.json 注意不是config.json.js 路径如下: 找到配置文件后打开,可以看到如下信息: 这里可以修改图片上传的信息,比如图片最大限制,图片格式,图片路径等问题.... 因为默认是保存在根目录下的ueditor下的  我这里我保存在了mymessystem文件加下  文件名仍用默认的  也可以自己修改 但是应该