怎么用C语言实现BMP图像开运算处理
发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,这篇文章主要介绍"怎么用C语言实现BMP图像开运算处理",在日常操作中,相信很多人在怎么用C语言实现BMP图像开运算处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎
千家信息网最后更新 2025年01月22日怎么用C语言实现BMP图像开运算处理
这篇文章主要介绍"怎么用C语言实现BMP图像开运算处理",在日常操作中,相信很多人在怎么用C语言实现BMP图像开运算处理问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"怎么用C语言实现BMP图像开运算处理"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。
运算:用B开启A就是选出了A中某些与B相匹配的点,这些点可由完全包含在A中的结构元素B的平移得到。也就是先腐蚀后加膨胀。
#include#include #include int main(int* argc, char** argv){ FILE* fp = fopen("./threshold.bmp", "rb"); if (fp == 0) return 0; BITMAPFILEHEADER fileHead; fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp); BITMAPINFOHEADER infoHead; fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp); int width = infoHead.biWidth; int height = infoHead.biHeight; int biCount = infoHead.biBitCount; int lineByte = (biCount*width / 8 + 3) / 4 * 4; RGBQUAD* pColorTable; pColorTable = new RGBQUAD[256]; fread(pColorTable, sizeof(RGBQUAD), 256, fp); unsigned char* pBmpBuf; pBmpBuf = new unsigned char[lineByte*height]; fread(pBmpBuf, lineByte*height, 1, fp); fclose(fp); // 新图 FILE* fop = fopen("open.bmp", "wb"); if (fop == 0) return 0; // 定义结构元素 // 腐蚀操作 int t = 0, d = 0, r = 0; for (int i = 1; i < height; ++i){ for (int j = 0; j < width - 1; ++j){ t = *(pBmpBuf + i*lineByte + j); // 当前点 d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面点 r = *(pBmpBuf + i*lineByte + j + 1); // 右边点 if (t == 0 && d != 0){ *(pBmpBuf + (i - 1)*lineByte + j) = 0;//下边的置位1 } if (t == 0 && r != 0){ *(pBmpBuf + i*lineByte + j + 1) = 0;//右边的置位1 j = j + 1; } } } // 膨胀操作 // 初始化 unsigned char* pBmpBuf2; pBmpBuf2 = new unsigned char[lineByte*height]; for (int i = 0; i < height; ++i){ for (int j = 0; j < width; ++j){ *(pBmpBuf2 + i*lineByte + j) = 255; } } // 腐蚀操作 for (int i = 1; i < height; ++i){ for (int j = 0; j < width - 1; ++j){ t = *(pBmpBuf + i*lineByte + j); // 当前点 d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面点 r = *(pBmpBuf + i*lineByte + j + 1); // 右边点 if (t == 0 && d == 0 && r == 0){ *(pBmpBuf2 + i*lineByte + j) = 0; // 当前点 } } } // 结构元素向上反转180度,对最下面一排处理 for (int j = 0; j < width - 1; ++j){ t = *(pBmpBuf + j); // 当前点 d = *(pBmpBuf + lineByte + j); // 上面点 r = *(pBmpBuf + j + 1); // 右边点 if (t == 0 && d == 0 && r == 0){ *(pBmpBuf2 + j) = 0; // 当前点 } } // 结构元素向右反转,对最右边一列处理 for (int i = 1; i < height; ++i){ t = *(pBmpBuf + i*lineByte + width - 1); d = *(pBmpBuf + (i - 1)*lineByte + width - 1); r = *(pBmpBuf + i*lineByte + width - 2); if (t == 0 && d == 0 && r == 0){ *(pBmpBuf2 + i*lineByte + width - 1) = 0; // 当前点 } } fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop); fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop); fwrite(pColorTable, sizeof(RGBQUAD), 255, fop); fwrite(pBmpBuf2, lineByte*height, 1, fop); fclose(fop); system("pause"); return 0;}
实验结果:
实验结果分析:效果图和原图差别不大。但细节如眼睛略微由区别。
到此,关于"怎么用C语言实现BMP图像开运算处理"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
处理
运算
元素
前点
结构
图像
右边
语言
学习
面点
更多
细节
结果
实验
帮助
实用
接下来
不大
也就是
作用
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
圆满完成春节网络安全保障
英雄联盟怎么退出虚拟服务器
数据库数据更新操作的实验报告
主从数据库技术
跨境电商数据库实例
给网站做网络安全的报价
数据库漏洞的相关安全事件
网络安全和信息化组长是谁
网络安全威胁主动攻击
高级软件开发工程师职称
齐齐哈尔软件开发培训学校
centos7服务器优化脚本
服务器内存 功耗
传奇盾服务器
校园网组建采用的网络技术
无锡物联网智慧工厂软件开发
服务器忙
徐州企业软件开发创新服务
行为安全管理服务器
图片 部署到服务器
数据库中权限最大的是
学习网络安全课后感想
海康摄像头开启虚拟服务器
你是为网络安全大赛而生的图片
机场运营数据库 实时数据库
工行软件开发工资
坦克纷争怎么进入服务器
数据库增长速度为10%怎么写
三调没有监理和数据库
内蒙古互联网新科技有限公司