/*
* @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;
}