低级的模仿的图像卷积算法

图像处理的基本操作就是矩阵运算了吧,也算是稍微理解下那些算法是怎么操作的

不过后来又看了一下,发现自己写的很幼稚。不管了,先摆出来,以后有时间再看。

#include <iostream>
#include <assert.h>
using namespace std;
#define MAX 100//矩阵最大阶

double Kernel[MAX][MAX] = { 0 };            //卷积核

class Pixel_INMAGE
{
public:
    double Pixel[MAX][MAX];         //像素阵
    double Result[MAX][MAX];            //变换结果矩阵
    //构造
    Pixel_INMAGE()
    {
        memset(Pixel, 0, sizeof(Pixel));
        memset(Result, 0, sizeof(Result));
    }
    //大小比较
    inline int max(int a, int b){ return a > b ? a : b; }
//*********************************************************
//函 数 名:Convolution_One
//参    数:  k    n    m
//         卷积核  行  列
//返 回 值:无
//备    注:压缩卷积
//*********************************************************
    void Convolution_One(int k, int n, int m)   //flag为1
    {
        assert(k <= m && k <= n);               //压缩矩阵
        for (int ROW_OF_RESULT = k / 2; ROW_OF_RESULT < n - k / 2; ROW_OF_RESULT++)
        {
            for (int COL_OF_RESULT = k / 2; COL_OF_RESULT < m - k / 2; COL_OF_RESULT++)
            {
                for (int ROW_OF_PIXEL = ROW_OF_RESULT - k / 2; ROW_OF_PIXEL <= ROW_OF_RESULT + k / 2; ROW_OF_PIXEL++)//像素矩阵行,等于号问题也是根据示例调出来的。
                {
                    int ROW_OF_KERNEL = ROW_OF_PIXEL - ROW_OF_RESULT + k / 2;
                    for (int COL_OF_PIXEL = COL_OF_RESULT - k / 2; COL_OF_PIXEL <= COL_OF_RESULT + k / 2; COL_OF_PIXEL++)
                    {
                        int COL_OF_KERNEL = COL_OF_PIXEL - COL_OF_RESULT + k / 2;   //我自己都佩服我自己
                        Result[ROW_OF_RESULT][COL_OF_RESULT] += Pixel[ROW_OF_PIXEL][COL_OF_PIXEL] * Kernel[ROW_OF_KERNEL][COL_OF_KERNEL];
                    }
                }
            }
        }
    }
//*********************************************************
//函 数 名:Convolution_Two
//参    数:  k    n    m
//         卷积核  行  列
//返 回 值:无
//备    注:本来是要分情况考虑的,太碎了,还不如来一个整体的。我认为难点在于等于号的取舍
//*********************************************************
    void Convolution_Two(int k, int n, int m)   //flag为2
    {
        for (int ROW_OF_RESULT = 0; ROW_OF_RESULT < n; ROW_OF_RESULT++)
        {
            for (int COL_OF_RESULT = 0; COL_OF_RESULT < m; COL_OF_RESULT++)
            {
                if (ROW_OF_RESULT - k / 2 >= 0 && COL_OF_RESULT - k / 2 >= 0)//卷积后的result[ROW_OF_RESULT][COL_OF_RESULT]对应的卷积核在Piexl之内
                {
                    for (int ROW_OF_PIXEL = ROW_OF_RESULT - k / 2; ROW_OF_PIXEL <= ROW_OF_RESULT + k / 2; ROW_OF_PIXEL++)//像素矩阵行
                    {
                        int ROW_OF_KERNEL = ROW_OF_PIXEL - ROW_OF_RESULT + k / 2;
                        for (int COL_OF_PIXEL = COL_OF_RESULT - k / 2; COL_OF_PIXEL <= COL_OF_RESULT + k / 2; COL_OF_PIXEL++)
                        {
                            int COL_OF_KERNEL = COL_OF_PIXEL - COL_OF_RESULT + k / 2;
                            Result[ROW_OF_RESULT][COL_OF_RESULT] += Pixel[ROW_OF_PIXEL][COL_OF_PIXEL] * Kernel[ROW_OF_KERNEL][COL_OF_KERNEL];
                        }
                    }
                }
                else if (ROW_OF_RESULT - k / 2 >= 0 && COL_OF_RESULT - k / 2 < 0)//若是像素阵列数为负
                {
                    for (int ROW_OF_PIXEL = ROW_OF_RESULT - k / 2; ROW_OF_PIXEL <= ROW_OF_RESULT + k / 2; ROW_OF_PIXEL++)
                    {
                        int ROW_OF_KERNEL = ROW_OF_PIXEL - ROW_OF_RESULT + k / 2;
                        for (int COL_OF_PIXEL = 0; COL_OF_PIXEL <= COL_OF_RESULT + k / 2; COL_OF_PIXEL++)
                        {
                            int COL_OF_KERNEL = k / 2 + COL_OF_PIXEL;
                            Result[ROW_OF_RESULT][COL_OF_RESULT] += Pixel[ROW_OF_PIXEL][COL_OF_PIXEL] * Kernel[ROW_OF_KERNEL][COL_OF_KERNEL];
                        }
                    }
                }
                else if (ROW_OF_RESULT - k / 2 < 0 && COL_OF_RESULT - k / 2 >= 0)//行数为负
                {
                    for (int ROW_OF_PIXEL = 0; ROW_OF_PIXEL <= ROW_OF_RESULT + k / 2; ROW_OF_PIXEL++)
                    {
                        int ROW_OF_KERNEL = k / 2 + ROW_OF_PIXEL;
                        for (int COL_OF_PIXEL = COL_OF_RESULT - k / 2; COL_OF_PIXEL <= COL_OF_RESULT + k / 2; COL_OF_PIXEL++)
                        {
                            int COL_OF_KERNEL = COL_OF_PIXEL - COL_OF_RESULT + k / 2;
                            Result[ROW_OF_RESULT][COL_OF_RESULT] += Pixel[ROW_OF_PIXEL][COL_OF_PIXEL] * Kernel[ROW_OF_KERNEL][COL_OF_KERNEL];
                        }
                    }
                }
                else            //行数列数全为负
                {
                    for (int ROW_OF_PIXEL = 0; ROW_OF_PIXEL <= ROW_OF_RESULT + k / 2; ROW_OF_PIXEL++)
                    {
                        int ROW_OF_KERNEL = k / 2 + ROW_OF_PIXEL;
                        for (int COL_OF_PIXEL = 0; COL_OF_PIXEL <= COL_OF_RESULT + k / 2; COL_OF_PIXEL++)
                        {
                            int COL_OF_KERNEL = k / 2 + COL_OF_PIXEL;
                            Result[ROW_OF_RESULT][COL_OF_RESULT] += Pixel[ROW_OF_PIXEL][COL_OF_PIXEL] * Kernel[ROW_OF_KERNEL][COL_OF_KERNEL];
                        }
                    }
                }
            }
        }
    }
//*********************************************************
//函 数 名:print
//参    数:  k    n    m    CONVOLUTIONAl_FLAG
//         卷积核  行  列    flag
//返 回 值:无
//备    注:输出答案
//*********************************************************
    void print(int k, int n, int m, int CONVOLUTIONAl_FLAG)
    {
        if (CONVOLUTIONAl_FLAG == 1)    //类型一输出,按照计算的时候输出
        {
            for (int ROW_OF_RESULT = k / 2; ROW_OF_RESULT < n - k / 2; ROW_OF_RESULT++)
            {
                for (int COL_OF_RESULT = k / 2; COL_OF_RESULT < m - k / 2; COL_OF_RESULT++)
                {
                    cout << (int)Result[ROW_OF_RESULT][COL_OF_RESULT] << ' ';
                }
                cout << endl;
            }
        }
        else                //类型二输出,图片无压缩
        {
            for (int ROW_OF_RESULT = 0; ROW_OF_RESULT < n; ROW_OF_RESULT++)
            {
                for (int COL_OF_RESULT = 0; COL_OF_RESULT < m; COL_OF_RESULT++)
                {
                    cout << (int)Result[ROW_OF_RESULT][COL_OF_RESULT] << ' ';
                }
                cout << endl;
            }
        }
        Pixel[MAX][MAX] = { 0 };
        Result[MAX][MAX] = { 0 };//矩阵重置为零
        Kernel[MAX][MAX] = { 0 };
    }
//*********************************************************
//函 数 名:Picture_Input
//参    数:   n    m
//             行  列
//返 回 值:无
//备    注:输入图像
//*********************************************************
    void Picture_Input(int n, int m)
    {
        for (int ROW_OF_PIXEL = 0; ROW_OF_PIXEL < n; ROW_OF_PIXEL++)//像素矩阵。
        {
            for (int COL_OF_PIXEL = 0; COL_OF_PIXEL < m; COL_OF_PIXEL++)

                cin >> Pixel[ROW_OF_PIXEL][COL_OF_PIXEL];
        }
    }
};
//*********************************************************
//函 数 名:Kernel_Input
//参    数:  k 卷积核
//返 回 值:无
//备    注:输入卷积核
//*********************************************************
void Kernel_Input(int k)
{
    for (int ROW_OF_KERNEL = 0; ROW_OF_KERNEL < k; ROW_OF_KERNEL++)//卷积核。
    {
        for (int COL_OF_KERNEL = 0; COL_OF_KERNEL < k; COL_OF_KERNEL++)
        {
            cin >> Kernel[ROW_OF_KERNEL][COL_OF_KERNEL];
        }
    }
}
int main()
{
    Pixel_INMAGE Picture;
    int k, n, m, CONVOLUTIONAl_FLAG;//k是k阶卷积核矩阵且k一定是奇数。n是行数,m是列数
    cin >> k >> n >> m >> CONVOLUTIONAl_FLAG;
    assert(k % 2 != 0);     //k坚决不为二
    Picture.Picture_Input(n, m);
    Kernel_Input(k);
    if (CONVOLUTIONAl_FLAG == 1)Picture.Convolution_One(k, n, m);
    else if (CONVOLUTIONAl_FLAG == 2)Picture.Convolution_Two(k, n, m);
    Picture.print(k, n, m, CONVOLUTIONAl_FLAG);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值