题目:一幅图像,背景为黑色,其中包含一些白色孤点,求包含白色点的最小的凸多边形。

比如图像:

思路:首先找到最下方的白色点。然后遍历每个白色点,求出当前点V1与每个白色点连成的方向向量。找出与单位向量向量(0,1)(当前向量)内积最小的那个方向向量。组成那个向量的白点即和V1相邻的下一个点V2。接着,更新当前向量为V1和V2连成的单位向量。再遍历每个白点,求出当前点V2和每个白色点连成的方向向量。找出与当前向量内积最小的那个单位向量。组成那个向量的白点即和V2相邻的下一个点V3。接着找出和V3相邻的下一个点。直到下一个点变为V1.即所有的边缘点都已找到。

参考代码:

%寻找包围白色点的最小的凸多边形
%生成一幅包含多个白色像素点的图片
height = 256;%图像高度
width = 256;%图像宽度
I = zeros(height,width);
%在图像中生成N个白色点
I(10,20) = 255;
I(30,50) = 255;
I(150,90) = 255;
I(240,100) = 255;
I(45,220) = 255;
I(90,90) = 255;
I(230,10) = 255;
I(220,240) = 255;
% I = imread('pp.jpg');
figure,imshow(I)
% [height,width] = size(I);
%寻找最下方的白色点
%注意此处跳出二重循环!!!
for i = height:-1:1flag = 0;%标记是是否找到for j = width:-1:1if i >= 1 && j >= 1 && I(i,j) == 255lowest_i = i;lowest_j = j;%记录最下方的点得坐标flag = 1;%已找到break;endendif flag == 1%已找到,跳出循环break;end
endMAXNUM = 9999999;
count = 0;%记录图像中白色点的数目
loca = zeros(MAXNUM,2);%记录各白色点的坐标
for i = 1:heightfor j = 1:widthif I(i,j) == 255count = count + 1;%白色点数目增加一loca(count,1) = i;loca(count,2) = j;endend
end%按序寻找位于凸多边形上的白色点
NumVetex = 0;%记录边缘点的个数
LocVetex = zeros(count,2);%按序记录各边缘点的坐标
%加入最下方的点
NumVetex = NumVetex + 1;
LocVetex(NumVetex,1) = lowest_i;
LocVetex(NumVetex,2) = lowest_j;
current_i = lowest_i;%当前点得坐标
current_j = lowest_j;
next_i = -1;%与当前点相邻的下一个位于凸多边形上面的白色点的坐标
next_j = -1;
while next_i ~= lowest_i && next_j ~= lowest_j%终止条件:回到最下方的点if current_i == lowest_i && current_j == lowest_j%第一个点current_prod_i = 0;%当前单位向量current_prod_j = 1;endMaxProd = -999999;%最大内积%寻找下一个点:内积最大for i = 1:countif current_i ~= loca(i,1) && current_j ~= loca(i,2)%跳过当前点%求其他点和当前点组成的向量prod_x = loca(i,1) - current_i;prod_y = loca(i,2) - current_j;%单位化prod_length = sqrt(prod_x * prod_x + prod_y * prod_y);prod_x = prod_x / prod_length;prod_y = prod_y / prod_length;TempProd = prod_x * current_prod_i + prod_y * current_prod_j;if MaxProd < TempProd%找到更大的内积MaxProd = TempProd;next_i = loca(i,1);%记录内积更大的点,即下一个边缘点next_j = loca(i,2);endendend%把下一个点加入边缘点坐标数组NumVetex = NumVetex + 1;LocVetex(NumVetex,1) = next_i;LocVetex(NumVetex,2) = next_j;%修改变量%当前单位向量变化prod_length = sqrt((next_i - current_i) * (next_i - current_i) + (next_j - current_j) * (next_j - current_j));current_prod_i = (next_i - current_i) / prod_length;current_prod_j = (next_j - current_j) / prod_length;%当前点后移current_i = next_i;current_j = next_j;
end%绘制多边形的边
for i = 2:NumVetexgrad = (LocVetex(i,2) - LocVetex(i - 1,2)) / (LocVetex(i,1) - LocVetex(i - 1,1));%直线斜率if LocVetex(i - 1,1) < LocVetex(i,1)for index_i = LocVetex(i - 1,1):LocVetex(i,1)index_j = LocVetex(i - 1,2) + grad * (index_i - LocVetex(i - 1,1));index_j = uint8(index_j);I(index_i,index_j) = 255;endelsefor index_i = LocVetex(i - 1,1):-1:LocVetex(i,1)index_j = LocVetex(i - 1,2) + grad * (index_i - LocVetex(i - 1,1));index_j = uint8(index_j);I(index_i,index_j) = 255;endend
end
figure,imshow(I)

运行结果:

【数字图像处理】求包含白色点得最小凸多边形相关推荐

  1. 第5章 Python 数字图像处理(DIP) - 图像复原与重建15 - 最小均方误差(维纳)滤波

    标题 最小均方误差(维纳)滤波 最小均方误差(维纳)滤波 目标是求未污染图像fff的一个估计f^\hat{f}f^​,使它们之间的均方误差最小. e2=E{(f−f^)2}(5.80)e^2 = E ...

  2. 数字图像处理作业: 包含质量因子的 JPEG压缩 python代码

    JPEG图片压缩的Python实现 注意:比较压缩率是 比较 原图与gpj文件的 大小 而非 解压后的bmp ,不管Q选择多少 解压后的bmp大小都是一样的. import numpy as np i ...

  3. 遥感数字图像处理教程复习整理

    目录 01 说明 遥感影像的存储方式 BSQ方式 BIL方式 BIP方式 如何计算图像存储空间大小(字节数)? 简单的单位换算 计算公式 简单地 复杂地 如何查看影像的基本信息/辅助信息? 如何进行直 ...

  4. 数字图像处理知识点梳理——第九章 形态学图像处理

    文章目录 1.预备知识 2.腐蚀和膨胀 3.开操作和闭操作 4.一些基本的形态学算法 1.预备知识 数学形态学的语言是集合论. 在形态学中集合的反射和平移广泛用来表达基于结构元(SE)的操作:研究一幅 ...

  5. lingo求一个直角三角形内接一个最小的正方形

    lingo求一个直角三角形内接一个最小的正方形 受给定一个直角三角形,求包含该三角形的最小正方形这道题的启发 model: sets: object/1-3/: f; endsets data: a, ...

  6. 最小凸多边形(凸包)

    描述 给出平面上n个点的坐标,计算最远两点间的距离,以及包含所有点的最小凸多边形(凸包) 输入 第一行一个整数n,接下来是n行的实数对,表示n个点坐标.2<=n<=10000 n x1 y ...

  7. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  8. 计算机视觉包含计算机图形学,[计算机视觉与图像识别]计算机视觉,计算机图形学和数字图像处理,三者之间的联系和区别.doc...

    [计算机视觉与图像识别]计算机视觉,计算机图形学和数字图像处理,三者之间的联系和区别.doc [计算机视觉与图像识别]计算机视觉,计算机图形学和数字图像处理,三者之间的联系和区别 篇一 : 计算机视觉 ...

  9. matlab 图像 幅度谱 低通滤波_数字图像处理期末复习2018-12-21

    数字图像处理期末复习2018-12-21 愉快先生 0.204 · 字数 5547 · 阅读 1834 2018-12-22 19:35 (数字图像冈萨雷斯第二版教材) 一.基本原理 图像的读取.存储 ...

最新文章

  1. 第八周实践项目3 顺序串一些算法操作
  2. linux系统——fread()与read()函数族区别
  3. 修改citrix 默认侦听端口的命令和XML Service端口
  4. 论文浅尝 | CFO: Conditional Focused Neural Question Answering
  5. 实时人脸识别例子-tensorflow2.x keras
  6. java怎么让窗口居中显示图片_Java_Swing中让窗口居中显示的方法(三种方法)
  7. 利用matlab做dsp实验,华工DSP实验一利用Matlab进行频谱分析
  8. 数据结构练习(08)链表中倒数第k个结点
  9. 在linux中常用的shell备份脚本(波大帅哥)
  10. iOS 中的正则匹配(工具类方法)
  11. 水星usb无线网卡linux驱动下载,水星USB无线网卡mw150us苹果macOS系统驱动成功
  12. freemarker生成简单模板
  13. matlab函数mapminmax,Matlab的mapminmax函数说明[转]
  14. 计算机软件工程规范国家标准
  15. 九九乘法表的四种打印模式
  16. 爬虫面试python
  17. Android BitmapShader实现圆形和圆角图片
  18. Windows命令行关闭IE代理
  19. 我研究推手的经过 - 向恺然
  20. 2020最全面试题库

热门文章

  1. 套娃的开始——Network in Network网络学习笔记
  2. python re 简单实例_python的re模块应用实例
  3. 潘达抽奖盒子小程序源码V3.3.4 附安装包+小程序前端
  4. HTML5响应式品牌服装设计类织梦模板
  5. 聚合搜索V2.0泛目录站群二开源码 可做指定关键词
  6. 全网首发Oreo易支付开源+教程
  7. 电脑DNS优选网络加速工具 可以提高网速
  8. 离散数学及其应用傅彦pdf_《离散数学及其应用》第二章 计算与探索
  9. php 缩略图增加水印,PHP生成缩略图加图片水印代码
  10. linux系统输入法怎么安装教程视频教程,Linux怎么安装中文输入法