#include<iostream>
#include<cmath>
#include<cstdio>

#define H 265
#define W 272

using namespace std;

int main()
{
    unsigned char *grey;
    grey = new unsigned char[H * W];
    FILE *f;
    fopen_s(&f, "./数据/blood.raw", "rb");
    if (f)
    {
        fread(grey, sizeof(unsigned char), H * W, f);
        fclose(f);
    }
    else
    {
        cout << "无法打开文件" << endl;
        return 0;
    }

    int tw = 3;
    int th = 3;
    int sobel_x[9]={-1,0,1,-2,0,2,-1,0,1};
    int sobel_y[9]={-1,-2,-1,0,0,0,1,2,1};

    int i,j,k,l;
    unsigned char *result_grey;
    result_grey = new unsigned char[H * W];

    for (i = 0; i < H * W; i++)
    {
        result_grey[i] = 255;
    }
    for (i = th / 2; i < H - th / 2; i++)
    {
        for (j = tw / 2; j < W - tw / 2; j++)
        {
            int gx = 0;
            int gy = 0;
            for (k = -th / 2; k <= th / 2; k++)
            {
                for (l = -tw / 2; l <= tw / 2; l++)
                {
                    int pixel = grey[(i + k) * W + (j + l)];
                    int index = (k + th / 2) * tw + (l + tw / 2);
                    gx += pixel * sobel_x[index];
                    gy += pixel * sobel_y[index];
                }
            }
            int sum = (int)sqrt(gx * gx + gy * gy);
            if (sum > 100)
            {
                result_grey[i * W + j] = 0;
            }
            else
            {
                result_grey[i * W + j] = 255;
            }
        }
    }
    FILE *fnew;
    fopen_s(&fnew, "./数据/sobel.raw", "wb");
    if (fnew)
    {
        fwrite(result_grey, sizeof(unsigned char), H * W, fnew);
        fclose(fnew);
    }
    else
    {
        cout << "创建文件失败" << endl;
        return 0;
    }
}
