This file was deleted.

This file was deleted.

@@ -1,7 +1,6 @@
#pragma once

#include "ProcessAlgorithms.h"


extern BITMAPFILEHEADER strHead;
extern BITMAPINFOHEADER strInfo;
@@ -14,28 +13,47 @@ void Binarization(IMAGEDATA* imagedata)
{
int gray_level = (*(imagedata + i * width + j)).red * 0.3 + (*(imagedata + i * width + j)).green * 0.59
+ (*(imagedata + i * width + j)).blue * 0.11;
gray_level = gray_level > 60 ? 255 : 0; //change your treethold here ps:lena 60
gray_level = gray_level > 128 ? 255 : 0; //change your treethold here ps:lena 60
(*(imagedata + i * width + j)).red = gray_level; //0.3
(*(imagedata + i * width + j)).green = gray_level;//0.59
(*(imagedata + i * width + j)).blue = gray_level;//0.11
}
}

void paintbmp(IMAGEDATA* imagedata)
{
for (int i = 0; i < height; ++i)
for (int j = 0; j < width; ++j)
{
if (color(i, j) != 0)
{
(*(imagedata + i * width + j)).blue = 255;
(*(imagedata + i * width + j)).green = 255;
(*(imagedata + i * width + j)).red = 255;
}
else
{
(*(imagedata + i * width + j)).blue = 0;
(*(imagedata + i * width + j)).green = 0;
(*(imagedata + i * width + j)).red = 0;
}
}
}

void fillRunVectors(IMAGEDATA* imagedata, int& NumberOfRuns, std::vector<int>& stRun,
std::vector<int>& enRun, std::vector<int>& rowRun)
{
#define rgb_sum(i,j) ((*(imagedata + i * width + j)).red + (*(imagedata + i * width + j)).green + (*(imagedata + i * width + j)).blue)
for (int i = 0; i < height; ++i)
for (int i = 0; i < height; ++i) //o(height * width)
{
if (rgb_sum(i, 0) != 0)
if (rgb_sum(i, 0) != 0)
{
NumberOfRuns++;
stRun.push_back(0);
rowRun.push_back(i);
}
for (int j = 1; j < width; ++j)
{
//std::cout << rgb_sum(i, j) << " ";
if (rgb_sum(i, j - 1) == 0 && rgb_sum(i, j) != 0)
{
NumberOfRuns++;
@@ -44,11 +62,11 @@ void fillRunVectors(IMAGEDATA* imagedata, int& NumberOfRuns, std::vector<int>& s
}
else if (rgb_sum(i, j - 1) != 0 && rgb_sum(i, j) == 0)
{
enRun.push_back(j); // j-1 -> j : add a right pixel to the enRun
enRun.push_back(j);
}

}
if (rgb_sum(i, width - 1))
if (rgb_sum(i, width - 1))
{
enRun.push_back(width - 1);
}
@@ -61,9 +79,6 @@ void firstPass(std::vector<int>& stRun, std::vector<int>& enRun, std::vector<int
std::vector<int>& runLabels, std::vector<std::pair<int, int>>& equivalences, int offset)
{
runLabels.assign(NumberOfRuns, 0);
//for (auto n : runLabels)
// std::cout << n << " ";
//std::cout << std::endl;
int idxLabel = 1;
int curRowIdx = 0;
int firstRunOnCur = 0;
@@ -77,7 +92,6 @@ void firstPass(std::vector<int>& stRun, std::vector<int>& enRun, std::vector<int
firstRunOnPre = firstRunOnCur;
lastRunOnPre = i - 1;
firstRunOnCur = i;

}
for (int j = firstRunOnPre; j <= lastRunOnPre; j++)
{
@@ -144,9 +158,6 @@ void replaceSameLabel(std::vector<int>& runLabels, std::vector<std::pair<int, in
runLabels[i] = labelFlag[runLabels[i] - 1]; //1-17
}
std::cout << "runLabels numbers: " << runLabels.size() << std::endl;
//for (auto n : runLabels)
// std::cout << n << " ";
//std::cout << std::endl;
}

void connect(IMAGEDATA* imagedata)
@@ -159,16 +170,27 @@ void connect(IMAGEDATA* imagedata)
int offset = 1; //1 8-n; 0 4-n
firstPass(stRun, enRun, rowRun, NumberOfRuns, runLabels, equivalences, offset);
replaceSameLabel(runLabels, equivalences);
for (int i = 0; i < runLabels.size(); ++i)
{
for (int j = stRun[i]; j < enRun[i]; ++j)
{
int rgb = runLabels[i] * 20 > 256 ? 200 : runLabels[i] * 20;
(*(imagedata + rowRun[i] * width + j)).red = rgb * 0.3 * runLabels[i];
(*(imagedata + rowRun[i] * width + j)).green = rgb * 0.59 * runLabels[i];
(*(imagedata + rowRun[i] * width + j)).blue = rgb * 0.11 * runLabels[i];
}
}

//for (int i = 0; i < runLabels.size(); ++i)
//{
// for (int j = stRun[i]; j < enRun[i]; ++j)
// {
// int rgb = runLabels[i] * 26 > 255 ? 175 : runLabels[i] * 26;
// (*(imagedata + rowRun[i] * width + j)).red = rgb * 0.3;
// (*(imagedata + rowRun[i] * width + j)).green = rgb * 0.59;
// (*(imagedata + rowRun[i] * width + j)).blue = rgb * 0.11;
// }
//}
}

}
//void floodfill(IMAGEDATA* imagedata, int x, int y, int oldcolor, int newcolor)
//{
// if (color(x, y) == oldcolor)
// {
// putpixel(x, y, newcolor);
// floodFill(imagedata, x + 1, y, oldcolor, newcolor);
// floodFill(imagedata, x, y + 1, oldcolor, newcolor);
// floodFill(imagedata, x - 1, y, oldcolor, newcolor);
// floodFill(imagedata, x, y - 1, oldcolor, newcolor);
// }
//}
@@ -7,13 +7,18 @@
#include "bmp_io.h"

void Binarization(IMAGEDATA* imagedata);
void paintbmp(IMAGEDATA* imagedata);

// connect regions algorithm start
void fillRunVectors(IMAGEDATA* imagedata, int& NumberOfRuns, std::vector<int>& stRun,
std::vector<int>& enRun, std::vector<int>& rowRun);
void firstPass(std::vector<int>& stRun, std::vector<int>& enRun, std::vector<int>& rowRun, int NumberOfRuns,
std::vector<int>& runLabels, std::vector<std::pair<int, int>>& equivalences, int offset);
void replaceSameLabel(std::vector<int>& runLabels, std::vector<std::pair<int, int>>& equivalence);

void connect(IMAGEDATA* imagedata);
// connect regions algorithm end


void floodfill(int x, int y, int oldcolor, int newcolor);
#define color(i,j) ((*(imagedata + i * width + j)).red + (*(imagedata + i * width + j)).green + (*(imagedata + i * width + j)).blue)
#endif // !PROCESS_ALGORITHM_H
@@ -34,12 +34,12 @@ typedef struct tagBITMAPINFOHEADER {
}BITMAPINFOHEADER; //位图信息头定义

//灰度图也许会用到,24bit图不需要。
//typedef struct tagRGBQUAD {
// BYTE rgbBlue; //该颜色的蓝色分量
// BYTE rgbGreen; //该颜色的绿色分量
// BYTE rgbRed; //该颜色的红色分量
// BYTE rgbReserved; //保留值
//}RGBQUAD;//调色板定义
typedef struct tagRGBQUAD {
BYTE rgbBlue; //该颜色的蓝色分量
BYTE rgbGreen; //该颜色的绿色分量
BYTE rgbRed; //该颜色的红色分量
BYTE rgbReserved; //保留值
}RGBQUAD;//调色板定义

//像素信息
typedef struct tagIMAGEDATA
@@ -49,5 +49,4 @@ typedef struct tagIMAGEDATA
BYTE blue;
}IMAGEDATA;


#endif // !BMP_FORMAT_H
@@ -0,0 +1,109 @@
#pragma once
#include "bmp_io.h"
#include "ProcessAlgorithms.h"

BITMAPFILEHEADER strHead;
BITMAPINFOHEADER strInfo;
RGBQUAD strRGB;
int width, height;

IMAGEDATA* LoadBMP()
{
char strFile[30];
std::cout << "Please Input BMP Filename: " << std::endl;
std::cin >> strFile;
FILE *fpi;
fpi = fopen(strFile, "rb");
if (fpi != NULL)
{
WORD bfType;
fread(&bfType, 1, sizeof(WORD), fpi);
if (0x4d42 != bfType)
{
std::cerr << "The file is not a bmp file!" << std::endl;
return NULL;
}
fread(&strHead, 1, sizeof(tagBITMAPFILEHEADER), fpi);
fread(&strInfo, 1, sizeof(tagBITMAPINFOHEADER), fpi);
fread(&strRGB, 1, sizeof(tagRGBQUAD), fpi);
//showBmpHead(strHead);
//showBmpInforHead(strInfo);
width = strInfo.biWidth;
height = strInfo.biHeight;
IMAGEDATA *imagedata = new IMAGEDATA[width * height];
for (int i = 0; i < height; ++i)
for (int j = 0; j < width; ++j)
{
(*(imagedata + i * width + j)).blue = 0;
(*(imagedata + i * width + j)).green = 0;
(*(imagedata + i * width + j)).red = 0;
}

fread(imagedata, sizeof(struct tagIMAGEDATA) * width, height, fpi);
fclose(fpi);
return imagedata;
}
else
{
std::cerr << "file open error!" << std::endl;
return NULL;
}

}

int SaveBMP(IMAGEDATA* img)
{
char strFile[30];
std::cout << "Please Input BMP Filename: " << std::endl;
std::cin >> strFile;
FILE *fpw;
if ((fpw = fopen(strFile, "wb")) == NULL)
{
std::cerr << "create bmp file error!" << std::endl;
return -1;
}
strInfo.biWidth = width;
strInfo.biHeight = height;
WORD bfType = 0x4d42;
//strHead.bfOffBits = 54;
//strHead.bfSize = strHead.bfOffBits + width * sizeof(struct tagIMAGEDATA) * height;
fwrite(&bfType, 1, sizeof(WORD), fpw);
fwrite(&strHead, 1, sizeof(tagBITMAPFILEHEADER), fpw);

strInfo.biSize = sizeof(BITMAPINFOHEADER);
strInfo.biSizeImage = 0;
strInfo.biBitCount = 1;
strInfo.biClrUsed = 0;
fwrite(&strInfo, 1, sizeof(tagBITMAPINFOHEADER), fpw);
fwrite(&strRGB, 1, sizeof(tagRGBQUAD), fpw);
//paintbmp(img);

fwrite(img, sizeof(struct tagIMAGEDATA) * width, height, fpw);
fclose(fpw);
delete[] img;
return 0;
}

void showBmpHead(BITMAPFILEHEADER pBmpHead) {
std::cout << "位图文件头:" << std::endl;
std::cout << "文件大小:" << pBmpHead.bfSize << std::endl;
std::cout << "保留字_1:" << pBmpHead.bfReserved1 << std::endl;
std::cout << "保留字_2:" << pBmpHead.bfReserved2 << std::endl;
std::cout << "实际位图数据的偏移字节数:" << pBmpHead.bfOffBits << std::endl << std::endl;
}

void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead) {
std::cout << "位图信息头:" << std::endl;
std::cout << "结构体的长度:" << pBmpInforHead.biSize << std::endl;
std::cout << "位图宽:" << pBmpInforHead.biWidth << std::endl;
std::cout << "位图高:" << pBmpInforHead.biHeight << std::endl;
std::cout << "biPlanes平面数:" << pBmpInforHead.biPlanes << std::endl;
std::cout << "biBitCount采用颜色位数:" << pBmpInforHead.biBitCount << std::endl;
std::cout << "压缩方式:" << pBmpInforHead.biCompression << std::endl;
std::cout << "biSizeImage实际位图数据占用的字节数:" << pBmpInforHead.biSizeImage << std::endl;
std::cout << "X方向分辨率:" << pBmpInforHead.biXPelsPerMeter << std::endl;
std::cout << "Y方向分辨率:" << pBmpInforHead.biYPelsPerMeter << std::endl;
std::cout << "使用的颜色数:" << pBmpInforHead.biClrUsed << std::endl;
std::cout << "重要颜色数:" << pBmpInforHead.biClrImportant << std::endl;
}

@@ -8,7 +8,7 @@
IMAGEDATA* LoadBMP();

int SaveBMP(IMAGEDATA* img);
//int SaveBMPBin(IMAGEDATA* img);


void showBmpHead(BITMAPFILEHEADER pBmpHead);
void showBmpInforHead(tagBITMAPINFOHEADER pBmpInforHead);
#endif // !BMP_IO_H
File renamed without changes.
@@ -8,13 +8,11 @@ int main()
//Binarization(img);

start = clock();
connect(img);
//connect(img);
end = clock();

int response = SaveBMP(img);
std::cout << response << std::endl;
delete[] img;

std::cout << "Runtime: " << end - start << std::endl;

return 0;

This file was deleted.

This file was deleted.

This file was deleted.