开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。@H_502_1@
运算:用B开启A就是选出了A中某些与B相匹配的点,这些点可由完全包含在A中的结构元素B的平移得到。也就是先腐蚀后加膨胀。@H_502_1@
#include #include #include int main(int* argc,char** argv)@H_502_1@ {@H_502_1@ file* fp = fopen("./threshold.bmp","rb");@H_502_1@ if (fp == 0)@H_502_1@ return 0;@H_502_1@ BITMAPfileheader filehead;@H_502_1@ fread(&filehead,sizeof(BITMAPfileheader),1,fp);@H_502_1@ BITMAPINFOheader infohead;@H_502_1@ fread(&infohead,sizeof(BITMAPINFOheader),fp);@H_502_1@ int wIDth = infohead.biWIDth;@H_502_1@ int height = infohead.biHeight;@H_502_1@ int biCount = infohead.biBitCount;@H_502_1@ int lineByte = (biCount*wIDth / 8 + 3) / 4 * 4;@H_502_1@ RGBQUAD* pcolortable;@H_502_1@ pcolortable = new RGBQUAD[256];@H_502_1@ fread(pcolortable,sizeof(RGBQUAD),256,fp);@H_502_1@ unsigned char* pBmpBuf;@H_502_1@ pBmpBuf = new unsigned char[lineByte*height];@H_502_1@ fread(pBmpBuf,lineByte*height,fp);@H_502_1@ fclose(fp);@H_502_1@ // 新图@H_502_1@ file* fop = fopen("open.bmp","wb");@H_502_1@ if (fop == 0)@H_502_1@ return 0;@H_502_1@ // 定义结构元素@H_502_1@ // 腐蚀 *** 作@H_502_1@ int t = 0,d = 0,r = 0;@H_502_1@ for (int i = 1; i < height; ++i){@H_502_1@ for (int j = 0; j < wIDth - 1; ++j){@H_502_1@ t = *(pBmpBuf + i*lineByte + j); // 当前点@H_502_1@ d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面点@H_502_1@ r = *(pBmpBuf + i*lineByte + j + 1); // 右边点@H_502_1@ if (t == 0 && d != 0){@H_502_1@ *(pBmpBuf + (i - 1)*lineByte + j) = 0;//下边的置位1@H_502_1@ }@H_502_1@ if (t == 0 && r != 0){@H_502_1@ *(pBmpBuf + i*lineByte + j + 1) = 0;//右边的置位1@H_502_1@ j = j + 1;@H_502_1@ }@H_502_1@ }@H_502_1@ }@H_502_1@ // 膨胀 *** 作@H_502_1@ // 初始化@H_502_1@ unsigned char* pBmpBuf2;@H_502_1@ pBmpBuf2 = new unsigned char[lineByte*height];@H_502_1@ for (int i = 0; i < height; ++i){@H_502_1@ for (int j = 0; j < wIDth; ++j){@H_502_1@ *(pBmpBuf2 + i*lineByte + j) = 255;@H_502_1@ }@H_502_1@ }@H_502_1@ // 腐蚀 *** 作@H_502_1@ for (int i = 1; i < height; ++i){@H_502_1@ for (int j = 0; j < wIDth - 1; ++j){@H_502_1@ t = *(pBmpBuf + i*lineByte + j); // 当前点@H_502_1@ d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面点@H_502_1@ r = *(pBmpBuf + i*lineByte + j + 1); // 右边点@H_502_1@ if (t == 0 && d == 0 && r == 0){@H_502_1@ *(pBmpBuf2 + i*lineByte + j) = 0; // 当前点@H_502_1@ }@H_502_1@ }@H_502_1@ }@H_502_1@ // 结构元素向上反转180度,对最下面一排处理@H_502_1@ for (int j = 0; j < wIDth - 1; ++j){@H_502_1@ t = *(pBmpBuf + j); // 当前点@H_502_1@ d = *(pBmpBuf + lineByte + j); // 上面点@H_502_1@ r = *(pBmpBuf + j + 1); // 右边点@H_502_1@ if (t == 0 && d == 0 && r == 0){@H_502_1@ *(pBmpBuf2 + j) = 0; // 当前点@H_502_1@ }@H_502_1@ }@H_502_1@ // 结构元素向右反转,对最右边一列处理@H_502_1@ for (int i = 1; i < height; ++i){@H_502_1@ t = *(pBmpBuf + i*lineByte + wIDth - 1);@H_502_1@ d = *(pBmpBuf + (i - 1)*lineByte + wIDth - 1);@H_502_1@ r = *(pBmpBuf + i*lineByte + wIDth - 2);@H_502_1@ if (t == 0 && d == 0 && r == 0){@H_502_1@ *(pBmpBuf2 + i*lineByte + wIDth - 1) = 0; // 当前点@H_502_1@ }@H_502_1@ }@H_502_1@ fwrite(&filehead,fop);@H_502_1@ fwrite(&infohead,fop);@H_502_1@ fwrite(pcolortable,255,fop);@H_502_1@ fwrite(pBmpBuf2,fop);@H_502_1@ fclose(fop);@H_502_1@ system("pause");@H_502_1@ return 0;@H_502_1@ }@H_502_1@ 实验结果:@H_502_1@ 原图 效果图@H_502_1@ @H_502_1@@H_502_1@ @H_502_1@ @H_502_1@@H_502_1@ 实验结果分析:效果图和原图差别不大。但细节如眼睛略微由区别。@H_502_1@ 总结 以上是内存溢出为你收集整理的C语言实现BMP图像处理(开运算)全部内容,希望文章能够帮你解决C语言实现BMP图像处理(开运算)所遇到的程序开发问题。 如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。 欢迎分享,转载请注明来源:内存溢出
评论列表(0条)