See More

/* * @brief ͼÏñ¶þÖµ»¯ÓëÐÎ̬ѧ±ä»» * @author Îâ³ÛÓò 3140100333 * @date 2017-04-05 */ #include #include #include //#include #include "image_io.h" using namespace std; #define BITMAP_ID 0x4D42 int main(int argv, char* argc[]) { BITMAPINFOHEADER bitmapInfoHeader; // bitmapÐÅϢͷ BITMAPFILEHEADER bitmapFileHeader; // bitmapÎļþÍ· unsigned char *bitmapData; // λͼÊý¾Ý char filename[100]; printf("Please input the name with .bmp of input image: "); scanf("%s", filename); bitmapData = LoadBitmapFile(filename, &bitmapFileHeader, &bitmapInfoHeader); // ¶ÁȡͼƬÊý¾Ý£¬·µ»ØÐÅϢͷ int m = bitmapInfoHeader.biHeight; // **ÐÐÊý²»ÐèÒª³Ë3 int n = (bitmapInfoHeader.biWidth + 3) / 4 * 4 * 3; // ×ÔÑ¡ãÐÖµ¶þÖµ»¯ for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { double y = 0.3 * bitmapData[i*n + j + 2] + 0.59 * bitmapData[i*n + j + 1] + 0.11 * bitmapData[i*n + j]; if (y - 125 > 0.000001) { bitmapData[i*n + j] = bitmapData[i*n + j + 1] = bitmapData[i*n + j + 2] = 255; } else bitmapData[i*n + j] = bitmapData[i*n + j + 1] = bitmapData[i*n + j + 2] = 0; } // Êä³ö¶þֵͼ output("binary.bmp", &bitmapFileHeader, &bitmapInfoHeader, bitmapData); // ÐÎ̬ѧ±ä»»£¬Ê¹ÓÃÊ®×ÖÐεÄelement structure const int dx[] = { 0, 0, -3, 0, 3, -6, -3, -3, 0, 0, 3, 3, 6 }; // dx·½ÏòÉÏÃ¿ÒÆ¶¯Ò»´ÎÒª+-3¡£Í¬Ê±ÕâÀïÐèÒª°Ñ×ÔÉíÒ²¿¼ÂǽøÈ¥ const int dy[] = { 0, -1, 0, 1, 0, 0, 1, -1, 2, -2, 1, -1, 0 }; int l = 13; //const int dx[] = { 0, 0, -3, 0, 3}; // dx·½ÏòÉÏÃ¿ÒÆ¶¯Ò»´ÎÒª+-3¡£Í¬Ê±ÕâÀïÐèÒª°Ñ×ÔÉíÒ²¿¼ÂǽøÈ¥ //const int dy[] = { 0, -1, 0, 1, 0}; //int l = 5; // ÅòÕÍ Dilation unsigned char *data_dilation = new unsigned char[bitmapInfoHeader.biSizeImage]; // **±ØÐëÖØÐ¶¨Ò壬¶¼ÔÚÔ­Êý¾ÝÉϲÙ×÷»áµ¼ÖÂÈ«²¿±ä°×¡£Ï൱ÓÚÊÇÔÚ¸üкóµÄͼƬÉϲ»¶ÏÅòÕÍ¡£ÖØÐ¶¨Òå±£Ö¤ÁËÖ»¸üÐÂÒ»´Î for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { int flag = 1; int center = i*n + j; for (int k = 0; k < l; k++) { int ii = i + dy[k]; int jj = j + dx[k]; int tmp = ii*n + jj; if (tmp >= 0 && tmp < m*n && bitmapData[tmp] == 0) // ÁÚ½üÇøÓòÖ»ÒªÓÐÒ»¸öΪºÚÉ«£¬¸Ãµã¼´ÎªºÚÉ« { flag = 0; break; } } if (flag == 1) // ÁÚÓòÎÞºÚÉ« data_dilation[center] = data_dilation[center + 1] = data_dilation[center + 2] = 255; else data_dilation[center] = data_dilation[center + 1] = data_dilation[center + 2] = 0; // **Ö»¸Ä¸Ãµã£¬²»ÄܸÄdown,up,left,rightËĸöµã } output("dilation.bmp", &bitmapFileHeader, &bitmapInfoHeader, data_dilation); // ¸¯Ê´ Erosion unsigned char *data_erosion = new unsigned char[bitmapInfoHeader.biSizeImage]; for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { int flag = 1; int center = i*n + j; for (int k = 0; k < l; k++) { int ii = i + dy[k]; int jj = j + dx[k]; int tmp = ii*n + jj; if (tmp < 0 || tmp >= m*n || bitmapData[tmp] == 255) // ÁÚ½üÇøÓò±ØÐëȫΪºÚÉ«£¬¸Ãµã¼´ÎªºÚÉ«¡£ÈôÓÐÇøÓòÔÚͼƬÍâ»òÊÇΪ°×É«£¬Ôò¸Ãµã¼´Îª°×É« { flag = 0; break; } } if (flag == 0) // ÁÚÓò²»ÊÇÈ«ºÚ data_erosion[center] = data_erosion[center + 1] = data_erosion[center + 2] = 255; else data_erosion[center] = data_erosion[center + 1] = data_erosion[center + 2] = 0; } output("erosion.bmp", &bitmapFileHeader, &bitmapInfoHeader, data_erosion); // ¿ªÔËËã Open unsigned char *data_open = new unsigned char[bitmapInfoHeader.biSizeImage]; // ¸¯Ê´ for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { int flag = 1; int center = i*n + j; for (int k = 0; k < l; k++) { int ii = i + dy[k]; int jj = j + dx[k]; int tmp = ii*n + jj; if (tmp < 0 || tmp >= m*n || bitmapData[tmp] == 255) // ÁÚ½üÇøÓò±ØÐëȫΪºÚÉ«£¬¸Ãµã¼´ÎªºÚÉ«¡£ÈôÓÐÇøÓòÔÚͼƬÍâ»òÊÇΪ°×É«£¬Ôò¸Ãµã¼´Îª°×É« { flag = 0; break; } } if (flag == 0) // ÁÚÓò²»ÊÇÈ«ºÚ data_open[center] = data_open[center + 1] = data_open[center + 2] = 255; else data_open[center] = data_open[center + 1] = data_open[center + 2] = 0; } //output("open_1.bmp", &bitmapFileHeader, &bitmapInfoHeader, data_open); unsigned char *data_open1 = new unsigned char[bitmapInfoHeader.biSizeImage]; // ÅòÕÍ for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { int flag = 1; int center = i*n + j; for (int k = 0; k < l; k++) { int ii = i + dy[k]; int jj = j + dx[k]; int tmp = ii*n + jj; if (tmp >= 0 && tmp < m*n && data_open[tmp] == 0) // ÁÚ½üÇøÓòÖ»ÒªÓÐÒ»¸öΪºÚÉ«£¬¸Ãµã¼´ÎªºÚÉ« { flag = 0; break; } } if (flag == 1) // ÁÚÓòÎÞºÚÉ« data_open1[center] = data_open1[center + 1] = data_open1[center + 2] = 255; else data_open1[center] = data_open1[center + 1] = data_open1[center + 2] = 0; } output("open.bmp", &bitmapFileHeader, &bitmapInfoHeader, data_open1); // ±ÕÔËËã close unsigned char *data_close = new unsigned char[bitmapInfoHeader.biSizeImage]; // ÅòÕÍ for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { int flag = 1; int center = i*n + j; for (int k = 0; k < l; k++) { int ii = i + dy[k]; int jj = j + dx[k]; int tmp = ii*n + jj; if (tmp >= 0 && tmp < m*n && bitmapData[tmp] == 0) // ÁÚ½üÇøÓòÖ»ÒªÓÐÒ»¸öΪºÚÉ«£¬¸Ãµã¼´ÎªºÚÉ« { flag = 0; break; } } if (flag == 1) // ÁÚÓòÎÞºÚÉ« data_close[center] = data_close[center + 1] = data_close[center + 2] = 255; else data_close[center] = data_close[center + 1] = data_close[center + 2] = 0; // **Ö»¸Ä¸Ãµã£¬²»ÄܸÄdown,up,left,rightËĸöµã } //output("close_1.bmp", &bitmapFileHeader, &bitmapInfoHeader, data_close); unsigned char *data_close1 = new unsigned char[bitmapInfoHeader.biSizeImage]; // ¸¯Ê´ for (int i = 0; i < m; i++) for (int j = 0; j < n; j += 3) { int flag = 1; int center = i*n + j; for (int k = 0; k < l; k++) { int ii = i + dy[k]; int jj = j + dx[k]; int tmp = ii*n + jj; if (tmp < 0 || tmp >= m*n || data_close[tmp] == 255) // ÁÚ½üÇøÓò±ØÐëȫΪºÚÉ«£¬¸Ãµã¼´ÎªºÚÉ«¡£ÈôÓÐÇøÓòÔÚͼƬÍâ»òÊÇΪ°×É«£¬Ôò¸Ãµã¼´Îª°×É« { flag = 0; break; } } if (flag == 0) // ÁÚÓò²»ÊÇÈ«ºÚ data_close1[center] = data_close1[center + 1] = data_close1[center + 2] = 255; else data_close1[center] = data_close1[center + 1] = data_close1[center + 2] = 0; } output("close.bmp", &bitmapFileHeader, &bitmapInfoHeader, data_close1); return 0; }