Ex2:改写Canny算法(只用CImg库)【code1】

把每个OpenCV的地方改成CImg即可,下面是lena图的测试结果。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


代码:
canny.h

//
//  canny.h
//  Canny Edge Detector
//
//  Created by Hasan Akgün on 21/03/14.
//  Copyright (c) 2014 Hasan Akgün. All rights reserved.
//

#ifndef _CANNY_
#define _CANNY_
#include "CImg.h"
#include <vector>

using namespace std;
using namespace cimg_library;

class canny {
private:
    CImg<unsigned char> img; //Original Image
    CImg<unsigned char> grayscaled; // Grayscale
    CImg<unsigned char> gFiltered; // Gradient
    CImg<unsigned char> sFiltered; //Sobel Filtered
    CImg<unsigned char> angles; //Angle Map
    CImg<unsigned char> non; // Non-maxima supp.
    CImg<unsigned char> thres; //Double threshold and final
public:

    canny(char[]); //Constructor
    CImg<unsigned char> toGrayScale();
    vector<vector<double> > createFilter(int, int, double); //Creates a gaussian filter
    CImg<unsigned char> useFilter(CImg<unsigned char>, vector<vector<double> >); //Use some filter
    CImg<unsigned char> sobel(); //Sobel filtering
    CImg<unsigned char> nonMaxSupp(); //Non-maxima supp.
    CImg<unsigned char> threshold(CImg<unsigned char>, int, int); //Double threshold and finalize picture
};

#endif

canny.cpp部分

canny::canny(char filename[])
{
    CImg<unsigned char> temp(filename);
    img = temp;

    if (0) // Check for invalid input
    {
        cout << "Could not open or find the image" << std::endl;

    }
    else
    {

    vector<vector<double> > filter = createFilter(3, 3, 1);

    //Print filter
    for (int i = 0; i<filter.size(); i++) 
    {
        for (int j = 0; j<filter[i].size(); j++) 
        {
            cout << filter[i][j] << " ";
        }
    }
    grayscaled = toGrayScale(); //Grayscale the image
    gFiltered = useFilter(grayscaled, filter); //Gaussian Filter
    sFiltered = sobel(); //Sobel Filter

    non = nonMaxSupp(); //Non-Maxima Suppression
    thres = threshold(non, 77, 95); //Double Threshold and Finalize 20 40

    /***************way1 to display*******************/
    CImgDisplay img_disp(img, "Original"),
                grayscaled_disp(grayscaled,"GrayScaled"),
                gFiltered_disp(gFiltered, "Gaussian Blur"),
                sFiltered_disp(sFiltered, "Sobel Filtered"),
                non_disp(non, "Non-Maxima Supp."),
                thres_disp(thres, "Final");
    while (!img_disp.is_closed()
            || !grayscaled_disp.is_closed()
            || !gFiltered_disp.is_closed()
            || !sFiltered_disp.is_closed()
            || !non_disp.is_closed()
            || !thres_disp.is_closed()) {
    }
    /***************way2 to display*******************/
    /*img.display("Original");         
    grayscaled.display("GrayScaled");
    gFiltered.display("Gaussian Blur");
    sFiltered.display("Sobel Filtered");
    non.display("Non-Maxima Supp.");
    thres.display("Final");*/
    }
}

这里是单单canny里面的改写,其他函数改动和这里差不多,大同小异,感觉自己改得有点蠢,就不全贴上来了。另外这里我用过两种display()的方式,个人喜好way1吧,各有各好处。


main.cpp

//
//  main.cpp
//  Canny Edge Detector
//
//  Created by Hasan Akgün on 21/03/14.
//  Copyright (c) 2014 Hasan Akgün. All rights reserved.
//

#include <iostream>
#define _USE_MATH_DEFINES
#include <cmath>
#include <vector>
#include "CImg.h"
#include "canny.h"
#include "canny.cpp"
using namespace cimg_library;
using namespace std;

int main()
{
    char path[4][99] = {"stpietro.bmp", "bigben.bmp", "lena.bmp", "twows.bmp"}; //Filepath of input image
    for (int i = 0; i < 4; i++) {
      canny res(path[i]);
    }
    return 0;
}

canny算法具体实现我并没有细看,这次仅仅是改写表达方式而已,把OpenCV改成CImg库,通过这次改写,实际上不但对CImg有了更好的认识,并且对canny的实现步骤也有更深的印象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值