首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

用Qt编撰图缩放算法

2013-01-02 
用Qt编写图缩放算法我想接触一下图像算法,但不知道该怎么入手,想自己练习一些简单的图像算法,之前MFC基本

用Qt编写图缩放算法
我想接触一下图像算法,但不知道该怎么入手,想自己练习一些简单的图像算法,之前MFC基本没接触过,Qt的用时间相对还算长一点,但还是不知道该怎么入手去编写处理图像的算法程序,在网上看到一个算法例子:http://blog.csdn.net/v_JULY_v/article/details/6227072  但不知道该怎么去在Qt实现,希能到大家的指点
[解决办法]
楼主是想要基础函数吧,例如描点、画线的函数?
Qt是C++的一个库,语法和C++是一样的。
[解决办法]
可能是getPixel之类的函数吧,参考QImage
我接触Qt时间也不长,以上仅供参考
[解决办法]
QImage已经为您实现了缩放的算法了,直接呼叫scale就好

如果你想开发影象处理的演算法
我会建议您用openCV2这种专门为了影象处理而开发的库
openCV2针对各类图象处理的演算法做了不少的优化
gpgpu,sse指令的优化都不在话下

以下是我利用openCV实现的bilinear缩放算法,抛砖引玉
希望能看见更快的实做方法


template<typename T>
cv::Mat_<T> const bilinear_interpolation(cv::Mat_<T> const &src, cv::Size dsize,
                                         float dx, float dy)
{
    cv::Mat_<T> dst = dsize.area() == 0 ? cv::Mat_<T>(src.rows * dy, src.cols * dx) :
                                          cv::Mat_<T>(dsize);

    float const x_ratio = static_cast<float>((src.cols - 1)) / dst.cols;
    float const y_ratio = static_cast<float>((src.rows - 1)) / dst.rows;
    for(int row = 0; row != dst.rows; ++row)
    {
        int y = static_cast<int>(row * y_ratio);
        float const y_diff = (row * y_ratio) - y; //distance of the nearest pixel(y axis)
        float const y_diff_2 = 1 - y_diff;
        auto *dst_ptr = &dst(row, 0)[0];
        for(int col = 0; col != dst.cols; ++col)
        {
            int x = static_cast<int>(col * x_ratio);
            float const x_diff = (col * x_ratio) - x; //distance of the nearet pixel(x axis)
            float const x_diff_2 = 1 - x_diff;
            float const y2_cross_x2 = y_diff_2 * x_diff_2;
            float const y2_cross_x = y_diff_2 * x_diff;
            float const y_cross_x2 = y_diff * x_diff_2;
            float const y_cross_x = y_diff * x_diff;


            for(int channel = 0; channel != cv::DataType<T>::channels; ++channel)
            {
                *dst_ptr++ = y2_cross_x2 * src(y, x)[channel] +
                             y2_cross_x * src(y, x + 1)[channel] +
                             y_cross_x2 * src(y + 1, x)[channel] +
                             y_cross_x * src(y + 1, x + 1)[channel];

            }
        }
    }

    return dst;
}



比起openCV2的resize慢了大约7倍,大概是没有用sse优化的关系
等杂事完成后我会学习使用opencl对这算法进行优化

热点排行