图像信息处理实验二
来源:互联网 发布:ida软件介绍 编辑:程序博客网 时间:2024/06/14 18:40
要求:
1. Image binarization
2. Binary image erosion
3. Binary image delation
4. Binary image opening
5. Binary image closing
#include <stdio.h>#include <Windows.h>void ToRGB(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图文件头BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");if (pFile == NULL){printf("打开位图失败\n");exit(-1);}fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile); //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile); //读取信息头WORD bitCount = infoHeader.biBitCount; //颜色位数if (bitCount == 16){exit(-1);}int Clr = 0;RGBQUAD *QUAD = NULL;if (bitCount < 16){Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;if (Clr>256)Clr = 0;}// 读取调色板int i = 0, j = 0;if (Clr > 0){QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);for (i = 0; i < Clr; i++){QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue);}}LONG pW = infoHeader.biWidth; //图像数据的宽度LONG pH = infoHeader.biHeight; //图像数据的高度 int pSize = ((pW * bitCount)>>3)*pH; //图像数据大小BYTE* P = (BYTE*)malloc(pSize); //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3); //行数据大小fread(P, pSize, 1, pFile); //存入图像数据if (Clr == 0){for (i = 0; i < pH; i++)//行{if (bitCount == 24){for (j = 0; j < pW * 3; j = j + 3)// 列,因为每个像素占3个字节 {int n = i*LineSize + j;int r = P[n];int g = P[n+1];int b = P[n + 2];int y = 0.299*r + 0.587*g + 0.114*b;int u = 0.492*(b - y);int v = 0.877*(r - y);y = y + 31; //把所有像素点的y增大31/*if (y > 255) //如果越界则置为255y = 255;if (y < 0)y = 0;if (u > 255) //如果越界则置为255u = 255;if (u < 0)u = 0;if (v > 255) //如果越界则置为255v = 255;if (v < 0)v = 0; */int R = y + 1.14*v;int G = y -0.394*u - 0.581*v;int B = y + 2.032*u;if (R > 255) //R如果越界则置为255R = 255;if (R < 0)R = 0;if (G > 255) //如果越界则置为255G = 255;if (G < 0)G = 0;if (B > 255) //如果越界则置为255B = 255;if (B < 0)B = 0;P[n] = (BYTE)(R); //分别是新r.g.b分量P[n + 1] = (BYTE)(G);P[n + 2] = (BYTE)(B);}}}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile); //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile); //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P=NULL;}}void ToGrey(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");if (pFile == NULL){printf("打开文件失败\n");exit(-1);}// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile); //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile); //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数if (bitCount == 16){exit(-1);}int Clr = 0;RGBQUAD *QUAD = NULL;if (bitCount < 16){Clr = infoHeader.biClrUsed ? infoHeader.biClrUsed : 1 << bitCount;if (Clr>256)Clr = 0;}// 读取调色板int i = 0, j = 0;if (Clr > 0){QUAD = (RGBQUAD*)malloc(sizeof(RGBQUAD)*Clr);fread(QUAD, sizeof(RGBQUAD)*Clr, 1, pFile);for (i = 0; i < Clr; i++){QUAD[i].rgbRed = QUAD[i].rgbBlue = QUAD[i].rgbGreen =(BYTE)(0.3 * QUAD[i].rgbRed + 0.59 * QUAD[i].rgbGreen + 0.11 * QUAD[i].rgbBlue); //灰度图像三个都是y}}LONG pW = infoHeader.biWidth; //图像数据的宽度LONG pH = infoHeader.biHeight; //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH; //图像数据大小BYTE* P = (BYTE*)malloc(pSize); //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3); //行数据大小fread(P, pSize, 1, pFile); //存入图像数据 for(i = 0; i < pH; i++)//行 {for (j = 0; j < pW*3; j = j + 3)// 列{ int n = i*LineSize + j; if(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]>120) P[n] = P[n + 1] = P[n + 2] = (BYTE)255; else P[n] = P[n + 1] = P[n + 2] = (BYTE)0;}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile); //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile); //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}void Delation(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");if (pFile == NULL){printf("打开文件失败\n");exit(-1);}// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile); //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile); //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数int Clr = 0;RGBQUAD *QUAD = NULL;int i = 0, j = 0;LONG pW = infoHeader.biWidth; //图像数据的宽度LONG pH = infoHeader.biHeight; //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH; //图像数据大小BYTE* P = (BYTE*)malloc(pSize); //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3); //行数据大小fread(P, pSize, 1, pFile); //存入图像数据 //先二值化 for(i = 0; i < pH; i++)//行 {for (j = 0; j < pW*3; j = j + 3)// 列{ int n = i*LineSize + j; if(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]>120) P[n] = P[n + 1] = P[n + 2] = (BYTE)255; else P[n] = P[n + 1] = P[n + 2] = (BYTE)0;}} //再delation int width=3,height=3; int mid=(width+1)/2-1; int p,q; int n; BYTE v = 255; for(i = mid; i < pH - mid; i++)//行 { for (j = mid; j < (pW-mid) * 3; j = j + 3)// 列{ for(p = 0; p < height; p++) { for(q = 0; q < width * 3; q = q + 3) { if(p == mid && q == mid) continue; n=(i+p)*LineSize + (j+q); v &= P[n]; } } n = i * LineSize + j; P[n] = P[n + 1] = P[n + 2] = v; v = 255;}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile); //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile); //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}void Erosion(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile); //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile); //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数int Clr = 0;RGBQUAD *QUAD = NULL;int i = 0, j = 0;LONG pW = infoHeader.biWidth; //图像数据的宽度LONG pH = infoHeader.biHeight; //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH; //图像数据大小BYTE* P = (BYTE*)malloc(pSize); //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3); //行数据大小fread(P, pSize, 1, pFile); //存入图像数据 //先二值化 for(i = 0; i < pH; i++)//行 {for (j = 0; j < pW*3; j = j + 3)// 列{ int n = i*LineSize + j; if(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]>120) P[n] = P[n + 1] = P[n + 2] = (BYTE)255; else P[n] = P[n + 1] = P[n + 2] = (BYTE)0;}} //再erosion int width=3,height=3; int mid=(width+1)/2-1; int p,q; int n; BYTE v = 0; for(i = mid; i < pH - mid; i++)//行 { for (j = mid; j < (pW-mid) * 3; j = j + 3)// 列{ for(p = 0; p < height; p++) { for(q = 0; q < width * 3; q = q + 3) { if(p == mid && q == mid) continue; n=(i+p)*LineSize + (j+q); v |= P[n]; } } n = i * LineSize + j; P[n] = P[n + 1] = P[n + 2] = v; v = 0;}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile); //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile); //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}void Opening(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile); //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile); //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数int Clr = 0;RGBQUAD *QUAD = NULL;int i = 0, j = 0;LONG pW = infoHeader.biWidth; //图像数据的宽度LONG pH = infoHeader.biHeight; //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH; //图像数据大小BYTE* P = (BYTE*)malloc(pSize); //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3); //行数据大小fread(P, pSize, 1, pFile); //存入图像数据 //先二值化 for(i = 0; i < pH; i++)//行 {for (j = 0; j < pW*3; j = j + 3)// 列{ int n = i*LineSize + j; if(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]>120) P[n] = P[n + 1] = P[n + 2] = (BYTE)255; else P[n] = P[n + 1] = P[n + 2] = (BYTE)0;}} //再erosion int width=3,height=3; int mid=(width+1)/2-1; int p,q; int n; BYTE v = 0; for(i = mid; i < pH - mid; i++)//行 { for (j = mid; j < (pW-mid) * 3; j = j + 3)// 列{ for(p = 0; p < height; p++) { for(q = 0; q < width * 3; q = q + 3) { if(p == mid && q == mid) continue; n=(i+p)*LineSize + (j+q); v |= P[n]; } } n = i * LineSize + j; P[n] = P[n + 1] = P[n + 2] = v; v = 0;}} //再Delation v = 255; for(i = mid; i < pH - mid; i++)//行 { for (j = mid; j < (pW-mid) * 3; j = j + 3)// 列{ for(p = 0; p < height; p++) { for(q = 0; q < width * 3; q = q + 3) { if(p == mid && q == mid) continue; n=(i+p)*LineSize + (j+q); v &= P[n]; } } n = i * LineSize + j; P[n] = P[n + 1] = P[n + 2] = v; v = 255;}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile); //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile); //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}void Closing(char* a, char* b){BITMAPFILEHEADER fileHeader;// 位图头文件BITMAPINFOHEADER infoHeader;// 位图信息头FILE* pFile = fopen(a, "rb");// 读取头信息fread(&fileHeader, sizeof(BITMAPFILEHEADER), 1, pFile); //读取文件头fread(&infoHeader, sizeof(BITMAPINFOHEADER), 1, pFile); //读取信息头WORD bitCount = infoHeader.biBitCount;//色彩的位数int Clr = 0;RGBQUAD *QUAD = NULL;int i = 0, j = 0;LONG pW = infoHeader.biWidth; //图像数据的宽度LONG pH = infoHeader.biHeight; //图像数据的高度int pSize = ((pW * bitCount)>>3)*pH; //图像数据大小BYTE* P = (BYTE*)malloc(pSize); //申请空间保存图像数据int LineSize = ((pW * bitCount)>> 3); //行数据大小fread(P, pSize, 1, pFile); //存入图像数据 //先二值化 for(i = 0; i < pH; i++)//行 {for (j = 0; j < pW*3; j = j + 3)// 列{ int n = i*LineSize + j; if(0.299*P[n] + 0.587*P[n + 1] + 0.114*P[n + 2]>120) P[n] = P[n + 1] = P[n + 2] = (BYTE)255; else P[n] = P[n + 1] = P[n + 2] = (BYTE)0;}}//先Delationint width=3,height=3; int mid=(width+1)/2-1; int p,q; int n;BYTE v = 255; for(i = mid; i < pH - mid; i++)//行 { for (j = mid; j < (pW-mid) * 3; j = j + 3)// 列{ for(p = 0; p < height; p++) { for(q = 0; q < width * 3; q = q + 3) { if(p == mid && q == mid) continue; n=(i+p)*LineSize + (j+q); v &= P[n]; } } n = i * LineSize + j; P[n] = P[n + 1] = P[n + 2] = v; v = 255;}} //再erosion v = 0; for(i = mid; i < pH - mid; i++)//行 { for (j = mid; j < (pW-mid) * 3; j = j + 3)// 列{ for(p = 0; p < height; p++) { for(q = 0; q < width * 3; q = q + 3) { if(p == mid && q == mid) continue; n=(i+p)*LineSize + (j+q); v |= P[n]; } } n = i * LineSize + j; P[n] = P[n + 1] = P[n + 2] = v; v = 0;}}FILE* dFile = fopen(b, "wb");//创建目标文件fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, dFile); //写入文件头fwrite(&infoHeader, sizeof(BITMAPINFOHEADER), 1, dFile); //写入文件信息头if (QUAD){fwrite(QUAD, sizeof(RGBQUAD)* Clr, 1, dFile);}//写入图像数据fwrite(P, pSize, 1, dFile);fclose(dFile);if (QUAD){free(QUAD);QUAD = NULL;}if (P){free(P);P = NULL;}}int main(){ToGrey("d.bmp", "grayd.bmp");ToRGB("d.bmp", "rgbd.bmp");Erosion("d.bmp", "erosiond.bmp");Delation("d.bmp","delationd.bmp");Opening("d.bmp","opend.bmp");Closing("d.bmp","closed.bmp");return 0;}
阅读全文
0 0
- 图像信息处理实验二
- 图像信息处理实验三
- 图像信息处理实验四
- 图像信息处理实验五
- 图像信息处理实验六
- 实验二 图像运算
- (实验二) --- 图像旋转变换---matlab实现
- 实验二 灰度图像的线性变换
- 图像识别实验过程(二)图像数据集的扩展
- 实验二 单链表实验
- 【实验二】串口实验
- 实验一&实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 实验二
- 跨域资源共享 CORS 实现思路
- GCC命令
- supervisor部署
- 【自用门户】jeecms搭建
- 杭电oj 2199
- 图像信息处理实验二
- VTK
- QQ分享
- 五周第五次课 2017.11.17 shell特殊符号cut命令、sort_wc_uniq命令、tee_tr_split命令、shell特殊符号下
- java多线程中关于数据共享
- HDOJ2093 考试排名
- 数据库和缓冲的一致性
- WeX5之登录注销功能实现
- Mqtt Broker部署方法