首页
📁归档
⏳时光机
🚩友链
📫留言
📧订阅本站
推荐
📕考研课程
🏜️ 免费壁纸
❤ 捐助本站
💰资助名单
🎵音乐实验
Search
1
【NPN/PNP三极管】放大电路饱和失真和截止失真的区别
20,026 阅读
2
论文写作中如何把word里面所有数字和字母替换为新罗马字体
10,579 阅读
3
【高数】形心计算公式讲解大全
9,022 阅读
4
Vivado-FPGA Verilog烧写固化教程
7,837 阅读
5
【概论】一阶矩、二阶矩原点矩,中心矩区别与概念
7,794 阅读
🪶微语&随笔
励志美文
我的随笔
写作办公
📡电子&通信
嵌入式&系统
通信&信息处理
编程&脚本笔记
⌨️IC&系统
FPGA&ASIC
VLSI&IC验证
EDA&虚拟机
💻电子&计算机
IP&SOC设计
机器学习
软硬件算法
登录
/
注册
信号处理(共6篇)
找到
6
篇与
信号处理
相关的结果
基于51/52单片机电容、电感、电阻参数测量系统设计与Proteus仿真
目录 一、设计任务和要求 二、方案设计与论证2.1 系统总设计框图 2.2 方案一:电桥平衡原理① 电阻的测量:直流电桥平衡原理 ② 电容的测量:交流电桥平衡原理 ③ 电感的测量:交流电桥平衡原理 2.3 方案二:频率转换法(本设计采用)① 电阻的测量:555 构成单稳态 ② 电容的测量:555 构成单稳态 ③ 电感的测量:电容三点式正弦波振荡 2.4 方案对比与选择 三、单元电路设计和参数计算3.1 电阻的检测单元电路设计 3.2 电容的检测单元电路设计 3.3 电感的检测单元电路设计 四、总原理图及元器件清单4.1 总原理图 4.2 元器件清单 五、程序设计5.1 程序流程图 5.2 核心代码中断函数(频率测量) 主函数 显示函数 键盘检测函数 5.3 完整程序清单及protues仿真文件(附录) 六、安装与调试6.1 仿真调试(1)电阻测量电路仿真 (2)电容测量电路仿真 (3)电感测量电路仿真 调试要点 液晶显示电路调试 仿真整体显示 6.2 实物调试电阻检测 电容检测 电感检测 八、参考文献 九、附录-完整软件程序与protues仿真文件 完整程序与仿真文件见文章末尾 一、设计任务和要求 设计并制作一个元器件参数测量仪 电阻阻值测量,范围:100Ω ~ 1MΩ 电容容值测量,范围:100pF ~ 10000pF 测量精度:±5% 电感参数的测量 扩大量程 提高测量精度 二、方案设计与论证 2.1 系统总设计框图 pasted_1784990858481_sxzptf.png图片 图1 系统总设计框图在测量各元件参数时,采用首先把电感、电容、电阻的参数转化为频率[1],再送至单片机检测,检测结束后,送至 LCD1602 进行显示。 2.2 方案一:电桥平衡原理 ① 电阻的测量:直流电桥平衡原理 pasted_1784990980814_5yavx3.png图片 图2 直流电桥平衡电路图根据电路平衡原理,不断调节电位器 R3,使得电表指针指向正中间,再测量电位器电阻值。 ② 电容的测量:交流电桥平衡原理 pasted_1784991076614_jito75.png图片 图3 交流电桥平衡电路图通过调节 Z1、Z2 使电桥平衡。这时电表的读数为零。通过读取 Z1、Z2、Zn 的值,即可得到被测电容的值。 ③ 电感的测量:交流电桥平衡原理 pasted_1784991402619_84r7tl.png图片 图4 交流电桥平衡电路图2.3 方案二:频率转换法(本设计采用) ① 电阻的测量:555 构成单稳态 pasted_1784991953296_lg44ir.png图片 图5 555 定时器构成单稳态电路图根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电阻阻值。 ② 电容的测量:555 构成单稳态 pasted_1785027612555_za97df.png图片 图6 555 定时器构成单稳态电路图** 根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电容值。 ③ 电感的测量:电容三点式正弦波振荡 pasted_1785027682239_4u3sw9.png图片 图7 电容三点式正弦波振荡电路图由电容三点式正弦波振荡电路得出频率,通过单片机读取高低电平得出频率,通过公式换算得到电感值。 2.4 方案对比与选择 对比项方案一(电桥法)方案二(频率法)测量精度受人为调节影响大单片机数字化,精度高操作难度调节麻烦,不易操作自动测量,一键显示电感测量不易测得准确值振荡电路,相对稳定数字化不易数字化便于单片机处理结论: 方案二通过单片机读取转化,精确度会明显提高,且便于数字化显示。故本设计选择方案二。 三、单元电路设计和参数计算 3.1 电阻的检测单元电路设计 pasted_1785027698225_mjicut.png图片 图8 555 定时器构成单稳态电路图由 555 单稳态触发公式: $$f=\frac{1}{\ln2(R_{1}+2R_x)C}$$ 得: $$R_x=\frac{1}{2}(\frac{1}{\ln2fC}-R_{1})$$ 从而,可以计算得出电阻值的大小。 3.2 电容的检测单元电路设计 pasted_1785028035648_x380cp.png图片 图9 555 定时器构成单稳态电路图根据 555 定时器构成单稳态,产生脉冲波形,通过单片机读取高低电平得出频率,通过公式换算得到电容值[2]。 由: $$f=\frac{1}{\ln2^*(R_1+2R_2)^*C_x}$$ 若 R1 = R2,得: $$C_x=\frac{1}{3\ln2^*f^*R_1}$$ 从而,可以计算得出电容值的大小。 3.3 电感的检测单元电路设计 pasted_1785028091408_lymeeb.png图片 图10 电容三点式正弦波振荡电路图由 LC 振荡频率公式: $$f=\frac{1}{2\pi\sqrt{\frac{C_1*C_2}{C_1+C_2}*L_x}}$$ 得: $$L_x=\frac{1}{\left(2\pi f\right)^2\frac{C_1*C_2}{C_1+C_2}}$$ 从而,可以计算得出电感值的大小。 四、总原理图及元器件清单 4.1 总原理图 pasted_1785028273962_o8rzuv.png图片 图11 电阻、电容、电感参数测试总原理图 pasted_1785028294514_u0wku4.png图片 图12 测量电阻、电容部分的原理图 pasted_1785028310991_mmmde2.png图片 图13 测量电感以及 ±5V 发生原理图4.2 元器件清单 元件序号型号数量备注U1STC89C52RC1单片机R3A103J1排阻R2, R3, R17, R1810KΩ4电位器X111.0592M1晶振C325V, 10uF1电解电容C1, C2, C11103 (0.01uF)3瓷片电容R1, R13, R1810KΩ3电阻J1, J2, J3, J4—4按键U216021液晶A1, A2NE5552555 定时器R4300Ω1电阻R5, R6510KΩ2电阻C4~C9104 (0.1uF)6瓷片电容R7, R9100KΩ2电阻C1050V, 22uF1电解电容Q1~Q3S9108 (NPN)3三极管R102KΩ1电阻R8, R11, R141KΩ3电阻C12, C1350V, 47uF2电解电容R12, R1939KΩ2电阻R15, R1651Ω2电阻C1425V, 470uF1电解电容U3NE555321运放五、程序设计 5.1 程序流程图 图14 中断程序流程图 pasted_1785028347463_kh1ui9.png图片 图15 主程序流程图 pasted_1785028417008_m02be6.png图片 初始化 (led_init, t_init, keyscan) ↓ 清屏 ↓ 循环: ├── 显示频率 display_f(f) └── 根据 a 值分支: ├── case 1: 计算电阻 R,显示 display_R(R) ├── case 2: 计算电容 C,显示 display_C(C) └── case 3: 计算电感 L,显示 display_L(L)5.2 核心代码 中断函数(频率测量) void T0_count() interrupt 1 { switch(a) { case 1: // 电阻测量 while(R_out); while(!R_out); TH0 = 0; TL0 = 0; while(R_out); while(!R_out); th0 = TH0; tl0 = TL0; TR0 = 0; break; case 2: // 电容测量 while(C_out); while(!C_out); TH0 = 0; TL0 = 0; while(C_out); while(!C_out); th0 = TH0; tl0 = TL0; TR0 = 0; break; case 3: // 电感测量 while(L_out); while(!L_out); TH0 = 0; TL0 = 0; while(L_out); while(!L_out); th0 = TH0; tl0 = TL0; TR0 = 0; break; } f = 1000000.0 / 1.085069 / (th0 * 256 + tl0) + 0.5; }主函数 void main() { led_init(); // 液晶初始化 t_init(); // 定时器初始化 keyscan(); // 按键检测 write_com(0x01); // 清屏 while(1) { display_f(f); switch(a) { case 1: // 电阻: R = (T/0.693 - 150) 换算 R = (ulong)(5000000.0 / 0.6931472 / f - 150 + 0.5); display_R(R); break; case 2: // 电容: C = 换算公式 C = (int)(100000000.0 / 153 / 0.6931472 / f + 0.5); display_C(C); break; case 3: // 电感: L = 1/(4π²f²C) 换算 L = (int)(1000000000000.0 / 0.1 / PI / PI / f / f + 0.5); display_L(L); break; } } }显示函数 // 频率显示 void display_f(ulong f) { uchar count = 0; ulong f0 = f; while(f) { f = f / 10; count++; } for(num = 5 + count; num > 5; num--) { table2[num] = f0 % 10 + 48; f0 = f0 / 10; } write_com(0x80); for(num = 0; num < 6 + count; num++) { write_data(table2[num]); delayms(5); } } // 电阻显示 void display_R(ulong R) { uchar count = 0; ulong R0 = R; while(R) { R = R / 10; count++; } for(num = 6 + count; num > 6; num--) { table3[num] = R0 % 10 + 48; R0 = R0 / 10; } write_com(0x80 + 0x40); for(num = 0; num < 7 + count; num++) { write_data(table3[num]); delayms(5); } } // 电容显示 void display_C(uint C) { uchar count = 0; uint C0 = C; while(C) { C = C / 10; count++; } for(num = 5 + count; num > 5; num--) { table4[num] = C0 % 10 + 48; C0 = C0 / 10; } write_com(0x80 + 0x40); for(num = 0; num < 6 + count; num++) { write_data(table4[num]); delayms(5); } } // 电感显示 void display_L(uint L) { uchar count = 0; uint L0 = L; while(L) { L = L / 10; count++; } for(num = 5 + count; num > 5; num--) { table5[num] = L0 % 10 + 48; L0 = L0 / 10; } write_com(0x80 + 0x40); for(num = 0; num < 6 + count; num++) { write_data(table5[num]); delayms(5); } }键盘检测函数 void keyscan() { if(key_R == 0) // 检测电阻按键 { delayms(10); // 消抖 if(key_R == 0) a = 1; } else if(key_C == 0) // 检测电容按键 { delayms(10); if(key_C == 0) a = 2; } else if(key_L == 0) // 检测电感按键 { delayms(10); if(key_L == 0) a = 3; } else while(key_R && key_C && key_L); // 等待按键按下 }5.3 完整程序清单及protues仿真文件(附录) 见文末附录部分。 六、安装与调试 6.1 仿真调试 (1)电阻测量电路仿真 图16 电阻测量的仿真电路图 pasted_1785028525830_e8xagf.png图片 图17 电阻测量的仿真输出波形 pasted_1785028553380_77yjdf.png图片(2)电容测量电路仿真 图18 电容测量的仿真电路图 pasted_1785028566386_213kgj.png图片 图19 电容测量的仿真输出波形 pasted_1785028577785_fn2fqc.png图片(3)电感测量电路仿真 图20 电感测量的仿真电路图 pasted_1785028588732_9bvoyx.png图片 图21 电感测量的仿真输出波形 pasted_1785028599631_39ilf2.png图片调试要点 接通电源,用示波器观察输出波形,若为方波,则电路焊接无误,否则检查电路[3] 在调试过程中发现,若改变电源电压,输出方波的频率会发生变化,计算出的数值存在一定误差 当 VCC 为 3.25V 左右时误差较小 液晶显示电路调试 将测量电路的输出分别与单片机的 P1^5、P1^6、P1^7 相接,观察液晶是否显示测量结果 在调试过程中发现,电阻、电容的测量误差较小 由于电容三点式震荡电路的频率不稳定,电感测量的误差较大 仿真整体显示 图22 电阻测量显示 pasted_1785028620741_10mwwy.png图片 图23 电容测量显示 pasted_1785028631102_motyub.png图片 图24 电感测量显示 pasted_1785028644198_twwyn4.png图片 图25 电源生成模块显示 pm2vEdK.png图片6.2 实物调试 实物按照仿真电路搭建,通电显示 "Welcome! RCL detector"。 图26 实物开机界面 pm2vmJe.png图片电阻检测 插入 2.7KΩ 电阻 若显示不准确,调节仿真中 R2 对应的电位器即可改变输出频率,使得检测精准 检测显示 2735Ω,可见调试准确 图27 电阻检测显示 pm2vnRH.png图片电容检测 插入 0.1uF 电容 若显示不准确,调节仿真中 R3 对应的电位器即可改变输出频率,使得检测精准 检测显示 101pF,可见调试准确[4] 图28 电容检测显示 pm2vuzd.png图片电感检测 插入 65mH 电感 若显示不准确,调节程序计算公式5,即可改显示结果,使得检测精准 检测显示 65535uH,可见调试准确 图29 电感检测显示 pm2vMQA.png图片八、参考文献 [1]杨沁佳.浅谈电感传感器微位移检测仪的原理与设计[J].数字通信世界,2019(09):143+159. [2]张璐雅,阮景.一种基于555时基电路的振荡器设计[J].集成电路应用,2019,36(12):12-13. [3]谢琪林.浅谈STC89S51单片机时序[J].电子测试,2020(24):139-140. [4]黄江.基于STM32的高精度电容测量仪设计[J].信息技术与信息化,2020(11):140-141. [5]王晓辉,王智永,韩智伟,胡帅可,谢印庆.基于三极管放大原理的电容三点式LC振荡器的设计[J].电子世界,2020(03):206. [6] E. L. Pankratov. An approach to model manufacturing of an enhanced swing differential Colpitts oscillator based on heterostructures to increase density of their elements with account mismatch-induced stress: on optimization of annealing. 2020, :1-19. 九、附录-完整软件程序与protues仿真文件 // ============================================ // RCL 测量仪程序 // 基于 STC89C52RC + NE555 + LCD1602 // ============================================ #include <reg52.h> #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define PI 3.1415926 // ========== 字符串常量 ========== uchar code table1[8] = "Welcome! RCL detector"; uchar table2[16] = "f(Hz)="; uchar table3[16] = "R(Ohm)="; uchar table4[16] = "C(pF)="; uchar table5[16] = "L(uH)=";
嵌入式&系统
通信&信息处理
软硬件算法
# 嵌入式
# 信号处理
# 软件算法
# 物联网
刘航宇
3天前
0
18
3
2026-07-24
利用图像处理技术mfc设计细胞识别程序-C++
目录 一、图像处理设计目标1.1 课题与技术指标 1.2 任务点 二、设计思路 三、创建工程及算法分析3.1 预备工作及工程创建 3.2 打开 BMP 图片与显示 HSI 值代码分析 主要代码 3.3 Mark - 细胞标记代码分析 主要代码 3.4 OnTwoValue() - 二值化代码分析 状态标记说明 主要代码 3.5 OnFillHoles() - 填洞代码分析 主要代码 3.6 shrink() - 收缩代码分析 主要代码 3.7 findcenter() - 中心点获取代码分析 合并中心点 去除多余圆或者错误圆 主要代码 3.8 count() - 统计代码分析 3.9 OnCellprgAll() - 按序执行全部 四、错误情况及分析4.1 未声明全局变量信息头 4.2 错把指针当作 int 型 4.3 软件菜单栏突然丢失 4.4 矩形框在鼠标未按下就出现了 五、总结 参考文献 一、图像处理设计目标 1.1 课题与技术指标 课题: 利用图像处理技术设计细胞识别程序。 设计指标: 实验 VS2019 MFC 开发平台 待识别图像为 24bit 的真彩色细胞图像进行处理 要求识别出细胞,并且保证准确度情况下,统计出细胞的个数和大小 1.2 任务点 完成图像标注:添加 cdib.h、cdib.cpp、添加函数、添加消息响应函数、添加菜单、打开图像 完成细胞的判别:持续判断 Maybe 点邻域有无 Mark 点、Sobel 计算边缘、删除孤立边缘、生成黑白图像 细胞收缩:利用 stack、vector 获取孔洞坐标、填充孔洞、Edge 处置 0、4 方向、8 方向交替生成边缘 细胞中心点信息获取:递归算法、判别局部是否全是边缘、储存全部中心位置 错误信息的删除:计算中心点均值、半径、去除半径过小的点、包含圆的剔除、相交过大圆的剔除、信息统计与显示 二、设计思路 图像处理之细胞识别的主要工作就是识别细胞数目以及选择出指定大小细胞。设计思路如下图所示。同时我们要去除不符合要求的中心点,来确定最终的细胞数目,去除太小和太大的细胞1,并结合实际来修改各种参数,设计合理。 pasted_1784860654942_5veaow.png图片 图1 系统设计思路 (流程图:打开图像 → HSI 转换 → 细胞标记 → 二值化 → 填洞 → 收缩 → 中心点获取 → 错误删除 → 统计输出)三、创建工程及算法分析 3.1 预备工作及工程创建 (1)VS2019 安装 MFC 与 C++ 开发环境 (2)创建 MFC 工程,配置 MFC 应用程序向导 pasted_1784860679771_dmm4ha.png图片 pasted_1784860708914_t33nmc.png图片 图2 创建工程 / 图3 MFC 配置3.2 打开 BMP 图片与显示 HSI 值 代码分析 (1)在 OnDraw 函数实现显示图片;在 messages 中添加 display() 实现打开一幅图像的功能。在 LoadBmp() 函数中利用 fopen 实现自动打开图片,利用 fread 读取图片信息。 (2)通过:查看 → 建立类向导 → 添加 OnMouseMove() 函数,添加代码实现获取所要信息;实现鼠标移动显示 HSI。 (3)通过函数 RgbtoHsi 实现 RGB 向 HSI 的转化。 RGB → HSI 转换原理: RGB 向 HSI 模型的转换是由一个基于笛卡尔直角坐标系的单位立方体向基于圆柱极坐标的双锥体的转换。基本要求是将 RGB 中的亮度因素分离,将色度分解为色调和饱和度,并用角向量表示色调2。如果直接对 R、G、B 处理,其处理过程中很可能会引起三个量不同程度的变化,这样就会产生色差问题,甚至带来颜色上的失真。HSI 模型的出现,使得在保持色彩无失真的情况下实现图像处理成为可能。 pasted_1784860731276_p9qcks.png图片 图4 HSI 显示效果主要代码 // HSI 主要代码示意 void RgbtoHsi(RGB* rgb, HSI* hsi) { // 将 RGB 转换为 HSI 色彩空间 // H: 色调, S: 饱和度, I: 亮度 // 分离亮度因素,保持色彩无失真 }pasted_1784860760614_roywnx.png图片 图5 HSI 主要代码3.3 Mark - 细胞标记 代码分析 确定 Mark 与 mbMark 是通过半径来的,通过计算图像上的某个像素点与细胞内部像素点的欧几里得距离与归一化门限值分别为 0.09 和 0.15 比较: r < 0.09 → Mark(红色,细胞内部) 0.09 < r < 0.15 → mbMark(蓝色,可能边界) OnMouseMove 函数里调用 RgbtoHsi(&rgb, &Hsi) 函数,可以在屏幕上显示鼠标所指点的坐标以及 RGB、HSI 和灰度值,通过 HSI 的可以选取合适的阈值来找到细胞以及边界3。 边缘提取的方法: 先滤波,去除噪声的影响,防止细胞内的噪声的影响 之后用 Sobel 算子 求出边界 之后画一个 5×5 的矩形,如果没有遇到边界,是噪声,去除 边界点是绿色。细胞边界分别用红色、暗红、蓝色和绿色标记出来 主要代码 // Mark 主要代码示意 // 根据 HSI 距离判断像素属性 // Sobel 边缘检测 + 噪声去除 // 多色标记不同区域pasted_1784860785613_yfx4ad.png图片 pasted_1784860803522_x9441d.png图片 pasted_1784860810461_y7dtuy.png图片 图6 Mark 主要代码 / 图7 标记后情况3.4 OnTwoValue() - 二值化 代码分析 背景灰度值为 128,细胞灰度值为 240,边缘为 255。二值化便于轮廓提取。 均值滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点 (x, y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点 (x, y),作为处理后图像在该点上的灰度 g(x, y),即 g(x, y) = 1/m ∑f(x, y);m 为该模板中包含当前像素在内的像素总个数。 状态标记说明 标记值含义0x7Xedge 边界(表示边界没 Mark,存在为四边)0x8XMark -- not edge(是细胞)0xfXMark -- edge0xX1visited(已访问)0x2CENTERED(中心点) m_vCenterPoints.at(j) —— 存储最后中心点的地方 主要代码 // 二值化主要代码示意 // 灰度阈值分割 + 均值滤波 // 状态标记管理pasted_1784860833275_8scd1m.png图片 pasted_1784860839706_6y6bwf.png图片 图8 二值化主要代码 / 图9 二值化现象3.5 OnFillHoles() - 填洞 代码分析 在阈值处理时,如果像素在阈值范围内,则像素将被标志。孔洞填充将先统计所有连通的非标志区域面积,总会有一个或者几个面积特别大的区域,其它的都是面积相对较小的区域。较小或者很小的往往就是系统所要填充的孔洞了。 填洞方法: 用栈(stack)、向量(vector)处理 从四个方向遍历,没访问过的黑点进栈,直到边和走完 之后读值到 xt, yt 并去值,v 放的是点的位置 没有碰到边界和小于 100,则填洞,即令洞的各点值为 Mark 值 将细胞中灰度值为 128 的部分的灰度值设置为 2404 填完细胞中的洞(即为 0 的值)后,处理非 Mark 的边界值(目的是打开边缘),设为 0。 主要代码 // 填洞主要代码示意 // stack + vector 获取孔洞坐标 // 连通区域面积统计 // 小区域填充为 Mark 值pasted_1784860863112_8iao9n.png图片 pasted_1784860868652_0m8z7m.png图片 图10 填洞主要代码 / 图11 填洞现象3.6 shrink() - 收缩 代码分析 收缩的目的是为了方便计数。扫描图像,对图像进行预先的 3 次腐蚀,判断所生成边界点,然后根据原理判定是否标注该点,存放所标志的中心点,便于统计细胞个数及计算细胞半径。 算法: 由 Mark 生成边界,我们有四邻域生成边界和八邻域生成边界 判断该点是否为 Mark 点,如果是 Mark 点的话,判断 i, j 是否是我们选取图片的边界,如果是的话,将该点变成边缘点 否则判断它的上下左右(周围八个点)是否有非 Mark 点,如果有,则将这边变成边缘点,反之不变 最后去掉边界则完成收缩 主要代码 // 收缩主要代码示意 // 3次腐蚀预处理 // 4/8邻域边界生成 // 边界点判定与标记pasted_1784860892612_9svgpz.png图片 图12 收缩主要代码及现象3.7 findcenter() - 中心点获取 代码分析 通过判断 MARK 点上下左右四个方向或者八个方向是否有非 Mark 点,如果有的话即认为是边界,将该点加上边界标志。 在收缩的过程(直到没有边界可去)中: 清除所有标志点 在不超过边下,没有被访问过的边缘,四个方向全是非 Mark 的话(收缩 k < 2 时)则是孤立点 k >= 2,是中心点,保存 x, y, 半径 还有除了边界就是背景,这也要保存(就是消失前保存) Mark(i, j): 八个方向,没有访问过的 Mark,且是边界点,则保存 SaveIT(i, j): 这点不是中心点(相当于没有访问过)则设为中心点(并保存);已经是中心点则去除标志,八方向寻找中心点 值得注意的是我们也要去除半径不大于 2 的孤立点,因为我们认为它的半径太小,是噪声。如果是半径大于 2 的孤立点,我们对他进行标记成中心点,对半径做一点补偿(pt.radius = k + pre_shrink_count + 4,4 为补偿),然后入队。合并中心点 本点是中心点,则八个方向看都不是中心点,则保存。有相连的话,多点求中心与半径(用到了 CalcCenterArea(i, j))。 CalcCenterArea(i, j): 八方向求中心点后去除标志,循环统计。半径取最大,而 x, y 则是取平均。 去除多余圆或者错误圆 相近圆: 圆心距离小于 10,则取半径小的中心点为中心点,取半径最大值 + 2 去除潜在的错误: 即半径小于 9 的去掉。但四个方向,边部补偿,防止边部的细胞被去除 多圆相交时,不相交部分小于则去除: 首先,相交部分先取出来保存 之后,单个圆内的交上了被标志(画一个方框然后统计之内的点数) 之后单个圆不相交的进行统计 不相交的占 50% 以下则清除本圆 主要代码 // 中心点获取主要代码示意 // 递归算法判别局部边缘 // 孤立点过滤与半径补偿 // 中心点合并与错误圆剔除pasted_1784860913700_o2gfhm.png图片 pasted_1784860921869_zuiuiy.png图片 图13 中心点获取主要代码及现象3.8 count() - 统计 代码分析 首先图像重新打开,然后获取细胞内部的 HSI 的最大值和最小值,并且计算细胞、平均半径、平均面积等值。 Count() 函数中首先调用了重载函数 reload(),将图片还原,随后将之前细胞识别所保留下来的信息(细胞个数),从 view.h 中提取信息,将细胞数、半径、面积显示在对话框中。 利用前面修正的结果,在 Count 模块进行总的计数,计算出平均半径和平均面积并输出 文件重新加载模块: 如果 noclick 置为 true,则进行重新加载图片 pasted_1784860943157_r86ld7.png图片 pasted_1784860947860_2i9gn5.png图片 pasted_1784860960332_53obi4.png图片 图14 重新加载图片 / 图15 最终标记现象 3.9 OnCellprgAll() - 按序执行全部 void OnCellprgAll() { // 依次调用前面各个函数 // 实现细胞识别的所有操作步骤 }pasted_1784860975641_sjtz6y.png图片 pasted_1784860983894_4m8nzp.png图片 图16 OnCellprgAll()代码分析: 不难看出调用了前面各个函数可以依次实现细胞识别的所有操作步骤。 四、错误情况及分析 4.1 未声明全局变量信息头 pasted_1784861010264_hf1vnq.png图片 图17 错误案例1原因: 缺少必要的头文件包含或全局变量声明 修正: 在适当位置添加全局变量声明 4.2 错把指针当作 int 型 pasted_1784861026701_fl51zf.png图片 图18 错误案例2修正: 应将 int m_pImage; 改为 BYTE* m_pImage; 4.3 软件菜单栏突然丢失 pasted_1784861045886_ob0u8q.png图片 图19 错误案例3原因: 误碰软件,把菜单移出去了 修正: 可以移动菜单栏使其恢复正常 pasted_1784861066297_b3vczn.png图片 图20 修正错误4.4 矩形框在鼠标未按下就出现了 原因: OnMouseMove 中判断条件不对 修正: 检查鼠标按下状态标志位的逻辑判断 五、总结 本项目基于 VS2019 MFC 平台,利用图像处理技术实现了细胞识别程序。主要技术路线包括: HSI 色彩空间转换 —— 分离亮度与色度,保持色彩无失真处理 Sobel 边缘检测 + 噪声过滤 —— 提取细胞边界 二值化与形态学处理 —— 填洞、腐蚀收缩,简化细胞轮廓 递归中心点检测 —— 通过迭代收缩获取细胞中心 后处理优化 —— 去除噪声点、合并相近圆、剔除错误检测 统计输出 —— 细胞个数、平均半径、平均面积 参考文献 1-2 ↩ 朱会平, 陈志远. 基于细胞显微图像的数量统计应用[J]. 实验室科学, 2011, 14(05): 73-75. ↩ 蔡朋杞. 红细胞识别系统的设计与实现[D]. 电子科技大学, 2011. ↩ 赵秋影. 人体细胞识别技术研究[D]. 长春理工大学, 2007. ↩
通信&信息处理
软硬件算法
# 信号处理
# 图像处理
# 通信&射频
刘航宇
5天前
0
20
2
FPGA&Matlab联合开发之滤波器模块(带通滤波器为例)
在通信或者信号处理中,数字滤波器是非常重要的模块,前面有关博文中提到FIR滤波器的一步步Verilog设计,如https://ee.ac.cn/index.php/archives/511.html 本文以带通滤波器为例,利用Matlab进行高效开发 目录 MATLAB生成低通滤波器设计步骤: Modelsim仿真上述文件 MATLAB生成低通滤波器设计步骤: (1)在MATLAB命令窗口中输入“filterDesigner”或“fdatool”出现如下对话框 image.png图片 设置FIR滤波器为和需要的阶数滤波器,选择窗函数的类型为海明窗函数,海明窗函数可以得到旁瓣更小的效果,能量更加集中在主瓣中 设置带通滤波器的上下截至频率分别为4MHz 和 5MHz (2)量化输入输出,点击工作栏左边的量化选项,即“set quantization parameters”选项,选择定点,设置输入字长为8,其他选择默认,如下图示: image.png图片 (3)根据自己需求,细化一些配置。这里不难探索 设置完成后,点击Targets中Generate HDL,选择生成Verilog 代码,设置路径,MATLAB即可生成设计好的滤波器Verilog HDL 代码以及测试文件: image.png图片 (4)根据需求,配置输出.v文件的全局信号、测试文件,点击生成,生成后,Matlab主页面会提示.v生成的文件路径 Modelsim仿真上述文件 image.png图片 可以看到输入信号在4MHZ~5MHZ备保留,设计无误。需要注意一点,一般Modelsim仿真输出波形都是离散的01信号,这里需要配置一下,在上图被选中的信号中,在左侧右键鼠标。 右击,format,analog(automatic); 右击,radix,decimal; 这两个步骤完成之后,就出现上图模拟信号的效果
嵌入式&系统
FPGA&ASIC
通信&信息处理
软硬件算法
# ASIC/FPGA
# 信号处理
# 硬件算法
刘航宇
3年前
0
676
2
2022-12-31
LoRa码元调制、编码与解调
LoRa调制链路 ●LoRa调制链路由五部分组成,分别是纠错编码机、交织器、扩频序列产生器、笛卡 尔极坐标转换器、Delta-sigma调制器。 image.png图片 纠错编码器 ●当一组数据(用户的有效载荷(Payload) )被推入数据包接口( Packet Interface)时,调制过程开始。调制器通过纠错编码机将前向纠错编码(ForwardErrorCorrection,FEC)添加到这些字节中。 ●这些有效载荷数据每个字节首先分成半字节(4比特一组)。然后,根据编码速率配置, 在1到4冗余纠错位之间选择并追加到每个半字节。调制器编码速率通过CR寄存器进行设置,表3-1为前向纠错编码配置表。 image.png图片 交织器 ●纠错编码后,产生的(4+CR)位比特段,随后被存储到交织器的存储阵列中。交织器(Interleaver) 有(4+CR)列和SF行。一旦交织器满了,它的内容将编码到码元上。每个码元都带有SF位。因此,交织器内有(4+CR) *SF 比特,独立于扩频因子SF被编码到4+CR码元上。 ●这里举一一个例子让读者理解交织器。假设此时CR=1,,, SF=7, 其交织器为7行、5列。需要传输的数据流为:00000001001000110100010101100111。先将这些比特流分为4b一组(b1,b2,b3,b4) : 0000; 0001; 0010; 0011; 0100;0101; 0110; 0111; 对上述数据增加1比特校验位(b1,b2,b3,b4,C) 后为: 00000; 00011; 00101; 00110; 01001;01010; 01100; 01111; 再将,上述数字填入交织器的存储列阵中,当35b数据进入交织器的存储列阵后,交织器存储满了,下一组数据(b1,b2,b3,b3,C) 需要填入下一个交织器中。 image.png图片 扩频序列产生器 image.png图片 门坐标转换、Delta-sigma调制输出 image.png图片 解调 image.png图片 编码 下是一个SF=7的LoRa调制编码图, 从图中可以看出码元、码片、比特速率、载荷数据之间的关系。 图中SF=7, 所以发送信号带宽切分为128(27-128)个频率段的码片。假设该系统工作频率为470MHz,BW=250kHz,相邻码片间隔为250kHz/128=1 .95kHz,此时f0=470MHz,f1=470.00195MHz,f2=470.0039MHz,.. .f127=470.24805MHz. 图3-9中有三个时间长度分别是码片率(Chip rate),比特速率(Data rate),码元率(Symbol rate),可以清楚地看出它们的对应关系. 图片 解释一下:如果要发送f64,就在f64频率出加到f127,然后再从f0加到f64 不同的SF对应带宽BW除以时间的斜率,SF越大倾斜角度越小。SF和BW对应一种LoRa调制方式,只有接收机也采用对应的SF和BW才能正常解调,否则信号在相干解 调中会淹没在噪声中。在实际的相干解调中,LoRa调制在不同的SF信号或不同的BW下都是正交的,频带可以充分利用。比如在BW=125kHz的同频段内,一个SF=7信号 Psez和一个SF=8信号Psps都在发射,频段内的噪声为N,,当两个信号都满足解调信噪比要求时(SNRsf7 >=-7.5dB; SNRsf8>=-10dB) ,两个信号都可以正常解调。这里需要注意,当计算SNRsf7时,SF=8的信号表现为此系统噪声,SNRsF7= Psp/(N0+Psf8) ; 同理当计算SNRsf8时,SF=7的信号表现为此系统噪声,SNRsf8=Psf8/(N0+Psf7). 图片
通信&信息处理
# 信号处理
刘航宇
4年前
0
1,239
1
【LoRa】Chirp调制
线性调频信号的表征与特征 线性调频(Linear Frequency Modulation, LFM) 是一种不需要伪随机编码序列的扩展频谱调制技术。因为线性调频信号占用的频带宽度远大于信息带宽,所以也可以获得很大的系统处理增益。线性调频信号也称为鸟声(Chirp) 信号,因为其频谱带宽落于可听范围,听着像鸟声(英文单词Chirp为鸟叫的意思),所以又称Chirp护展频谱(Chirp SpreadSpectrum,CSS)技术。LFM技术在雷达、声纳技术中有广泛应用,例如,在雷达定位技术中,它可用来增大射频脉冲宽度、加大通信距离、提高平均发射功率,同时又保持足够的信号频谱宽度,不降低雷达的距离分辨率。 将CSS技术用于扩频通信的研究发展日益活跃,尤其随着超宽带(UWB) 技术的发展,将CSS技术与UWB的宽带低功率谱相结合形成的Chi rp-UWB通信,它利用Chi rp技术产生超宽带宽,具备二者优势,增强了抗干扰与抗噪声的能力。CSS技术已成为传感网络通信标准,IEEE802. 15中物理层候选标准。 FM、FSK、CSS信号比较 图片 线性调频(LFM)信号 图片 Chirp信号调制技术的产生与检测 Chirp通信信号-般形式 通信的二元数据也可用LFM信号,常称为Chirp信号来传输。最常用做法是用围绕着中心频率f的正向和负向频率斜升变化来代表二元信码“1”与“0” 接收端采用两个相应的匹配滤波器来检测。匹配滤波器 输出是一个峰值功率正比于时间带宽积FT的压缩脉冲, 通过取样判决可以恢复出信码“1”。代表信码“0”的负斜 率Chirp信号通过对应的负斜率匹配滤波器可得出与正斜 率匹配滤波器相同结论的压缩脉冲,通过取样判决确定 信码“0”。 图片 2.信号调制 图片 3.Chirp信号解调和检测 图片 LoRa调制 图片 图片 图片
通信&信息处理
# 信号处理
刘航宇
4年前
0
2,048
3
2021-02-13
信号与系统公式大全-傅里叶、拉普拉斯、z变化、卷积
图片 图片 图片 图片 图片 图片
通信&信息处理
# 信号处理
刘航宇
5年前
0
675
2