• 19725阅读
  • 27回复

QT 数字图像处理 [复制链接]

上一主题 下一主题
离线dongliang
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2012-06-24
关键词: 数字图像处理
QT 图像处理',this.id)" style="cursor:pointer;border-bottom: 1px solid #FA891B;" id="rlt_1">数字图像处理, 不用解释看效果:

椒盐噪声:


其他的还有:
边缘检测 Sobel算子
边缘检测 Roberts算子
水平镜像
垂直镜像

剩余的等大家来实现.


欢迎大家批评,指正错误.


ImageProcess_code.zip (1573 K) 下载次数:1289

离线roywillow

只看该作者 1楼 发表于: 2012-06-25
支持一下!
专业维修核潜艇,回收二手航母、二手航天飞机,大修核反应堆,拆洗导弹发动机更换机油,无人侦察机手动挡改自动,航天飞机保养换三滤,飞碟外太空年检 ,各型号导弹加装迎宾踏板,高空作业擦洗卫星表面除尘、打蜡及抛光,东风全系列巡航导弹。并提供原子对撞机。量大从优,有正规发票。
离线ppdayz

只看该作者 2楼 发表于: 2012-06-25
支持
离线machou

只看该作者 3楼 发表于: 2012-06-25
呵呵,赞一个    
离线lzihua

只看该作者 4楼 发表于: 2012-06-25
这么高端,数字图像处理。
离线lzihua

只看该作者 5楼 发表于: 2012-06-25
用QImage 来处理图像好使吗?
离线dongliang

只看该作者 6楼 发表于: 2012-06-25
读入图像是调用qt中的类,但是关键是数据的处理部分,完全是自己写得代码,.其实调用qt的类也可以实现,但是那样的话,即使做出来了,很多东西还不清楚.
离线dongliang

只看该作者 7楼 发表于: 2012-06-25
用QImage 读入后,有一个类成员函数返回的是图像数据的首地址,这时我用一个memcpy拷贝数据到零时变量tmpbuffer中,对图像的数据进行操作,操作完了,然后反向拷贝.这样重新显示QImage对象的数据,就是处理后的图像.这就是整体的思路.
离线nankezi88
只看该作者 8楼 发表于: 2012-07-05
我想在你这个代码的基础上实现福利叶变换,用的是C++中的一段代码,但是不成功啊,很郁闷,你能看看怎么改吗
void ImageProcess::fft(QImage Image)
{


        // 中间变量
        double    dTemp;

        // 循环变量
        int    i;
        int    j;

        // 进行付立叶变换的宽度和高度(2的整数次方)
       int    w;
        int    h;

        int        wp;
        int        hp;
        //int byteWidth;

        //BYTE *pImageDataTemp=(BYTE *)malloc(sizeof(BYTE)*biDataSize);
        w = 1;
        h= 1;
        wp = 0;
        hp = 0;

        //std::complex<double> *TD =  (std::complex<double>*)malloc(sizeof(std::complex<double>)*biDataSize);
        //std::complex<double> *FD =  (std::complex<double>*)malloc(sizeof(std::complex<double>)*biDataSize);
        /*byteWidth = biWidth*3;
        if (byteWidth%4)
           byteWidth += 4-(byteWidth%4);*/

        while(w * 2 <=biWidth)
        {
            w *= 2;
            wp++;
        }

        while(h * 2 <= biHeight)
        {
            h *= 2;
            hp++;
        }
       // biDataSize=w*h;
        // 分配内存
        std::complex<double> *TD =  (std::complex<double>*)malloc(sizeof(std::complex<double>)*(w*h));
        std::complex<double> *FD =  (std::complex<double>*)malloc(sizeof(std::complex<double>)*(w*h));
         BYTE *pByte=(BYTE *)malloc(sizeof(BYTE)*(w*h));
        // 行
        for(i = 0; i <  h; i++)
        {
            // 列
            for(j = 0; j < w; j++)
         {
               // if(8 == depth) //采用了256色调色板,8位颜色索引
                //{
                pByte = Image.bits() +(biHeight-1- i )* lLineBytes + j;
                TD[j + w * i] = std::complex<double>(*(pByte), 0);
                //}
                /*else if(32 == depth)//32位表示,数据格式为0xFFBBGGRR或0xAABBGGRR
                {
                pByte = Image.bits() + i * lLineBytes + j * 4;
                //根据RGB模式转化成YIQ色彩模式的方式,取Y作为灰度值
                BYTE pixelValue = (BYTE)(0.299 * (float)pByte[0] + 0.587 * (float)pByte[1]
                + 0.114 * (float)pByte[2]);
                 TD[j + w * i] = std::complex<double>( pixelValue, 0);
                }
                else
                {

                return;
                }*/
                //memcpy(Image.bits(), pByte, biDataSize);

            //}
        }

        for(i = 0; i <  h; i++)
        {
            // 对y方向进行快速付立叶变换
            onfft(&TD[w * i], &FD[w * i], wp);
        }

        // 保存变换结果
        for(i = 0; i <  h; i++)
        {
            for(j = 0; j <w; j++)
            {
                TD[i + h * j] = FD[j + w * i];
            }
        }

        for(i = 0; i <w; i++)
        {
            // 对x方向进行快速付立叶变换
            onfft(&TD[i * h], &FD[i * h], hp);
        }

        // 行
        for(i = 0; i < h; i++)
        {
            // 列
            for(j = 0; j <  w; j++)
            {
                // 计算频谱
                dTemp = sqrt(FD[j * h + i].real() * FD[j * h + i].real() +
                             FD[j * h + i].imag() * FD[j * h + i].imag()) / 100;

                // 判断是否超过255
                if (dTemp > 255)
                {
                    // 对于超过的,直接设置为255
                    dTemp = 255;
                }
                *pByte = dTemp;

              /* if(8 == depth) //采用了256色调色板,8位颜色索引
                {
                pByte = Image.bits() + i * lLineBytes + j;
                *pByte = dTemp;
                }
                else if(32 == depth)//32位表示,数据格式为0xFFBBGGRR或0xAABBGGRR
                {
                pByte = Image.bits() + i * lLineBytes + j * 4;

               pByte[0] = pByte[1] = pByte[2] = dTemp;
                }
                else
                {

                return;
                }*/


                // 更新源图像

               memcpy(Image.bits(), pByte, sizeof(BYTE)*(w*h));
            }

        }

        // 删除临时变量
        free (TD);
        free (FD);
        free(pByte);
     }
}

void ImageProcess::onfft(std::complex<double> * TD, std::complex<double> * FD, int r)

{
    /*if(0 == power)
    {
    y[0] = a[0];
    return;
    }
    int n = 1 << power;
    double angle = 2 * PI / n;
    std::complex<double> wn(cos(angle), sin(angle));
    std::complex<double> w(1, 0);
    std::complex<double> *a0 = (std::complex<double>*)malloc(sizeof(std::complex<double>)*(n/2));
    std::complex<double> *a1 = (std::complex<double>*)malloc(sizeof(std::complex<double>)*(n/2));
    std::complex<double> *y0 = (std::complex<double>*)malloc(sizeof(std::complex<double>)*(n/2));
    std::complex<double> *y1 = (std::complex<double>*)malloc(sizeof(std::complex<double>)*(n/2));
    for(int i = 0; i < n / 2; i ++)
    {
    a0 = a[2 * i];
    a1 = a[2 * i + 1];
    }
    //分开成两个子fft过程
    onfft(a0, y0, power - 1);
    onfft(a1, y1, power - 1);
    std::complex<double> u;
    for(int k = 0; k < n / 2; k++) //蝶形算法
    {
    u = w * y1[k];
    y[k] = y0[k] + u;
    y[k + n / 2] = y0[k] - u;
    w = w * wn;
    }
    free( a0);
    free(a1);
    free( y0);
    free( y1);*/



        // 付立叶变换点数
        LONG    count;

        // 循环变量
        int        i,j,k;

        // 中间变量
        int        bfsize,p;

        // 角度
        double    angle;

        std::complex<double> *W,*X1,*X2,*X;

        // 计算付立叶变换点数
        count = 1 << r;

        // 分配运算所需存储器
        W  =(std::complex<double>*)malloc(sizeof(std::complex<double>)*(count/2));
        X1 = (std::complex<double>*)malloc(sizeof(std::complex<double>)*(count));
        X2 = (std::complex<double>*)malloc(sizeof(std::complex<double>)*(count));

        // 计算加权系数
        for(i = 0; i < count / 2; i++)
        {
            angle = -i * PI * 2 / count;
            W =std:: complex<double> (cos(angle), sin(angle));
        }

        // 将时域点写入X1
        memcpy(X1, TD, sizeof(std::complex<double>) * count);

        // 采用蝶形算法进行快速付立叶变换
        for(k = 0; k < r; k++)//第k次迭代
        {
            for(j = 0; j < 1 << k; j++)
            {
                bfsize = 1 << (r-k);//第k次蝶型单元数目
                for(i = 0; i < bfsize / 2; i++)
                {
                    p = j * bfsize;
                    X2[i + p] = X1[i + p] + X1[i + p + bfsize / 2];
                    X2[i + p + bfsize / 2] = (X1[i + p] - X1[i + p + bfsize / 2]) * W[i * (1<<k)];
                }
            }
            X  = X1;
            X1 = X2;
            X2 = X;
        }

        // 重新排序
        for(j = 0; j < count; j++)
        {
            p = 0;
            for(i = 0; i < r; i++)
            {
                if (j&(1<<i))
                {
                    p+=1<<(r-i-1);
                }
            }
            FD[j]=X1[p];
        }

        // 释放内存
        free( W);
        free (X1);
        free( X2);

离线dongliang

只看该作者 9楼 发表于: 2012-07-06
楼上的问题:
我将所有的bmp格式8,24,32位深度,全部都转化为24.所以你上面的仅仅是考虑了8位和32位.没有考虑24.位深度不同,数据的格式也不同.你可以在MainWindow.cpp文件中找到openfile函数中loadImage = loadImage.convertToFormat(QImage::Format_RGB888);            更改Format_RGB888.

由于我对傅立叶变换原理也不了解,上课打酱油去了.现在参加了培训,没有时间再去弄了.请见谅!
离线borlittle
只看该作者 10楼 发表于: 2012-07-10
不错啊,下来学习一下
离线dayqr

只看该作者 11楼 发表于: 2012-10-24
非常感谢    顶
离线skbysp

只看该作者 12楼 发表于: 2013-03-15
回 楼主(dongliang) 的帖子
真心需要
离线sicuanyx
只看该作者 13楼 发表于: 2013-05-06
太专业了,学习,
请问楼主,我要做两帧图片的比较,怎么做
只看该作者 14楼 发表于: 2013-05-06
不错啊
离线pamxy

只看该作者 15楼 发表于: 2013-07-25
支持一个—— ——
你不是最优秀的,但你可以成为最优秀的, you are the best!
离线starfishes

只看该作者 16楼 发表于: 2013-08-26
谢谢楼主分享。
离线zheguzai

只看该作者 17楼 发表于: 2013-08-27
支持下,谢谢分享
离线ggxo619

只看该作者 18楼 发表于: 2013-11-02
谢谢分享,楼主大神牛逼
离线xinyinshe
只看该作者 19楼 发表于: 2013-11-05
最近正好在学习这方面的东西,真心感谢楼主的分享
离线season4675

只看该作者 20楼 发表于: 2014-04-15
最近研究图像处理,真心感谢
离线blake

只看该作者 21楼 发表于: 2014-04-18
不错

只看该作者 22楼 发表于: 2014-04-24
请问楼主,这是在Qt那个版本编出来的,我跑了一下程序,里面有些成员函数说是没有,感觉版本低了。
离线tool_in_kit

只看该作者 23楼 发表于: 2014-05-08
你是用什么控件显示图片的?
离线zxt0504

只看该作者 24楼 发表于: 2014-05-14
谢谢LZ分享,学习中!
离线hunterzf

只看该作者 25楼 发表于: 2015-11-18
谢谢
离线std_2009

只看该作者 26楼 发表于: 2015-12-20
牛逼啊,很好的程序好好学习
离线xushuai_sio

只看该作者 27楼 发表于: 2016-01-14
为什么不用opencv啊。。。
快速回复
限100 字节
 
上一个 下一个