自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(9)
  • 收藏
  • 关注

原创 区域生长与分裂合并

算法从选定的种子像素出发,逐步将邻域中满足相似性条件的像素合并到种子区域中,直到没有符合条件的像素可加入,最终形成连通的目标区域。设计的交互界面可实现图像的一键加载、算法快速切换、参数实时调节,整合后的算法可完成从图像预处理(实验1 - 实验7)到区域分割的全流程处理,系统响应速度满足实时处理要求,结果图像可正常保存为常见格式(PNG、JPG)。1. 功能模块整合:将实验1 - 实验7的算法(如边缘检测、阈值分割、形态学处理等)与本次的区域生长法、分裂合并法封装为独立函数模块。

2025-12-14 16:59:30 253

原创 图像阈值分割实验报告

其中 \omega_1、\omega_2 是前景、背景的像素占比,\mu_1、\mu_2 是两类的灰度均值,遍历所有可能的 T 并取使 \sigma^2(T) 最大的 T。• 直方图双峰法:若图像直方图呈现明显的“双峰值”(分别对应前景、背景的灰度分布),则取两个峰值之间的谷点作为阈值 T。2. 设计并实现三种典型阈值分割算法:直方图双峰法、迭代阈值分割法、最大类间方差(OTSU)阈值分割法。2. 用 T_0 分割图像为前景、背景,计算两类像素的灰度均值 \mu_1、\mu_2;

2025-12-01 12:47:04 235

原创 图像空域滤波实验报告

它在抑制高斯噪声的同时,对图像细节的模糊程度比均值滤波更柔和。通过本次实验,我深入掌握了图像空域滤波的原理,明确了平滑滤波(均值、高斯、中值)的区别与适用场景:均值滤波和高斯滤波适用于均匀噪声,中值滤波适用于椒盐噪声;• 效率差异:对一幅512×512的图像,使用3×3模板时,OpenCV方法的处理时间在毫秒级,而手动Python实现的时间在秒级,差距显著,体现了OpenCV底层优化的优势。通过理论分析与代码实现,验证均值滤波、高斯滤波、中值滤波的原理,观察它们对不同噪声图像的处理效果。

2025-10-19 17:03:36 360

原创 基于PyQt6和OpenCV的面部图像采集与标注

4. 松开鼠标后,图像会以指定格式(如face_1.jpg)保存到所选路径,同时对应的标注信息(图像序号、脸部区域坐标)会保存到同名的txt文件(如face_1.txt)中,且会弹出“标注完成,图像已保存”的提示。3. 图像标注与保存:通过鼠标事件监听,实现对采集图像中脸部区域的手动框选,再将图像和对应的标注信息(图像序号、脸部区域坐标)分别保存为图片文件和文本文件。3. 点击“采集”按钮,此时窗口会显示当前采集的图像,按照提示用鼠标在图像上框选脸部区域。

2025-09-16 11:55:01 674

原创 opencv摄像头的读取与识别

• 分类器选择:除人脸外,OpenCV还提供眼睛(haarcascade_eye.xml)、微笑(haarcascade_smile.xml)等预训练模型,替换路径即可实现对应目标识别。◦ 识别效果差:调整scaleFactor(1.05-1.2)或minNeighbors(3-8),或更换更高精度的模型(如Dlib、YOLO)。2. 目标识别:加载预训练模型(如OpenCV自带的人脸分类器),对读取的帧进行灰度转换(降低计算量),再用模型检测目标位置,最后绘制识别框。

2025-09-15 18:43:01 412

原创 C语言中的烟花代码

批量绘制:通过 BeginBatchDraw() 和 FlushBatchDraw() 实现批量绘制,减少屏幕刷新次数,提高绘制效率,从而减少动画卡顿现象。颜色管理:通过 RGB() 函数定义烟花的颜色,并利用 setfillcolor() 设置填充颜色,以模拟不同的火花效果。随机数生成:通过 rand() 函数生成随机数,控制烟花的初始位置、颜色、爆炸半径等参数,使每次烟花的效果都不相同。时间控制:使用 Sleep(2) 来控制动画的刷新速度,使烟花的升空、爆炸等效果更加流畅,并避免动画过快而不易观察。

2025-01-11 16:16:08 388

原创 如何避免C语言中指针导致的错误?

当对指针进行加减运算时,其移动的字节数是根据指针所指向的数据类型来确定的。例如,对于一个int *p(假设int占4个字节),p + 1实际上是将指针向后移动4个字节,指向内存中下一个int类型的位置。如果该指针指向的是动态分配的内存,需要在函数结束前释放内存,否则会导致内存泄漏。每个通过malloc等函数分配的内存块只能被释放一次,并且释放后的指针不应该再被使用,除非重新赋值。例如,对于一个单独分配的内存块(不是数组),随意地对指针进行算术运算可能会导致访问到不相关的内存区域。5. 理解指针的运算规则。

2024-12-19 21:21:05 344

原创 C语言的注意事项

如果没有函数原型声明,编译器会按照一种隐式声明规则来处理函数调用,这可能会导致参数类型不匹配等错误。声明了一个名为add的函数,它接受两个int类型的参数并返回一个int类型的值。并且在使用完动态分配的内存后,要使用free函数释放内存,否则会造成内存泄漏。例如,未初始化的指针可能指向任意内存地址,这可能会导致程序崩溃或产生不可预测的结果。C99标准允许在代码块的任何位置声明变量,但传统的C风格是在函数开头声明所有变量。例如,使用有意义的变量名和函数名,适当添加注释来解释代码的功能等。

2024-12-19 21:20:07 374

原创 C语言中的数组类型

数组从语义上说就是存放数据的一个集合。下标是对应数组元素所在数组的位置。访问超过数组下标的元素,就越界了;元素是数组内存里面存放的数据。

2024-12-19 21:18:36 132

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除