注册 登录
编程论坛 QT论坛

Qt实现Lee滤波程序

duandingfeng 发布于 2015-05-10 16:30, 3541 次点击
#include<QApplication>
#include<QImage>
#include<QLabel>
#include<QtMath>
#include <QImageReader>
#include<QDebug>

int main(int argc,char *argv[])
{
    QApplication app(argc,argv);
    QImage *oldImage,*leeImage;
    oldImage = new QImage("test.tiff");
    //原始图像长和宽
    int width = 0,height = 0;
    width = oldImage->width();
    height = oldImage->height();

    //滤波窗口大小
    int filterWinSize = 3;
    //滤波窗口一半
    int halfWinSize = filterWinSize / 2;
    //实际滤波窗口大小
    int realWinSize = (halfWinSize * 2) + 1;
    //相干斑指数平方
    double exp = 1.0/realWinSize;
    //double exp = 1.0;
    //构造新图像
    leeImage = new QImage(width,height,QImage::Format_RGB32);
    //原图像开始的横纵坐标
    int startRow,startCol,endRow,endCol;
    startRow = halfWinSize + 1;
    startCol = halfWinSize + 1;
    endRow = width - halfWinSize;
    endCol = height -halfWinSize;
    //扫描整幅图像
    for(int j = startCol; j < endCol; ++j)
    {
        for(int i = startRow; i < endRow; ++i )
        {
            //存储每个窗口rgb和
            double counter_r = 0.0,counter_g = 0.0,counter_b = 0.0;
            //存储像素rgb平均值
            double mean_r = 0.0,mean_g = 0.0,mean_b = 0.0;
            //实际每个窗口像素个数
            int pixelCount = 0;
            //每个小窗口始坐标
            int win_start_row,win_start_col;
            win_start_row = i - halfWinSize;
            win_start_col = j - halfWinSize;
            //遍历窗口像素,求窗口平均值
            for(int win_i = 0; win_i < realWinSize; ++win_i)
            {
                for(int win_j = 0; win_j < realWinSize; ++win_j)
                {
                    //统计像素个数
                    pixelCount++;
                    //取出每个像素rgb值并累加求和
                    QRgb rgb = oldImage->pixel((win_start_row + win_i),(win_start_col + win_j));
                    counter_r += qRed(rgb);
                    counter_g += qGreen(rgb);
                    counter_b += qBlue(rgb);
                }
            }
            //qDebug()<<"pixelCount:"<<pixelCount<<"\n";
            //qDebug()<<"realWinSize:"<<realWinSize<<"\n";
            //qDebug()<<"exp:"<<exp<<"\n";
            //求平均值
            mean_r = counter_r / pixelCount;
            mean_g = counter_g / pixelCount;
            mean_b = counter_b / pixelCount;
            //qDebug()<<"mean_r:"<<mean_r<<"mean_g:"<<mean_g<<"mean_b:"<<mean_b<<"\n";
            //计数器清零
            counter_r = 0.0;
            counter_g = 0.0;
            counter_b = 0.0;
            //遍历窗口像素,求窗口方差
            //像素rgb方差
            double var_y_r = 0.0,var_y_g = 0.0,var_y_b = 0.0;
            double var_x_r = 0.0,var_x_g = 0.0,var_x_b = 0.0;
            //相干斑抑制参数
            double b_r = 0.0,b_g = 0.0,b_b = 0.0;
            //最终rgb值
            int result_r = 0,result_g = 0,result_b = 0;

            for(int win_i = 0; win_i < realWinSize; ++win_i)
            {
                for(int win_j = 0; win_j < realWinSize; ++win_j)
                {
                    //取出每个像素rgb值并累加求和
                    QRgb rgb = oldImage->pixel((win_start_row + win_i),(win_start_col + win_j));
                    //
                    double temp_r = 0.0,temp_g = 0.0,temp_b = 0.0;
                    temp_r = qRed(rgb) - mean_r;
                    temp_g = qGreen(rgb) - mean_g;
                    temp_b = qBlue(rgb) - mean_b;
                    //qDebug()<<"temp_r:"<<temp_r<<"temp_g:"<<temp_g<<"temp_b:"<<temp_b<<"\n";
                    counter_r += (temp_r * temp_r);
                    counter_g += (temp_g * temp_g);
                    counter_b += (temp_b * temp_b);
                }
            }
            //求方差
            var_y_r    = counter_r / pixelCount;
            var_y_g = counter_g / pixelCount;
            var_y_b = counter_b / pixelCount;
            //qDebug()<<"counter_r:"<<counter_r<<"counter_g:"<<counter_g<<"counter_b:"<<counter_b<<"\n";
            //qDebug()<<"var_y_r:"<<var_y_r<<"var_y_g:"<<var_y_g<<"var_y_b:"<<var_y_b<<"\n";
            //
            var_x_r = (var_y_r - ( mean_r * mean_r * exp))/(1.0+exp);
            var_x_g = (var_y_g - ( mean_g * mean_g * exp))/(1.0+exp);
            var_x_b = (var_y_b - ( mean_b * mean_b * exp))/(1.0+exp);
            //qDebug()<<"var_x_r:"<<var_x_r<<"var_x_g:"<<var_x_g<<"var_x_b:"<<var_x_b<<"\n";
            //
            b_r = var_x_r/var_y_r;
            b_g = var_x_g/var_y_g;
            b_b = var_x_b/var_y_b;
            //qDebug()<<"b_r:"<<b_r<<"b_g:"<<b_g<<"b_b:"<<b_b<<"\n";
            //取出原像素值
            QRgb oldrgb = oldImage->pixel(i,j);
            double temp_r = 0.0,temp_g = 0.0,temp_b = 0.0;
            temp_r = qRed(oldrgb) - mean_r;
            temp_g = qGreen(oldrgb) - mean_g;
            temp_b = qBlue(oldrgb) - mean_b;
            double x,y,z;
            x = mean_r + (b_r * temp_r) + 0.5;
            y = mean_g + (b_g * temp_g) + 0.5;
            z = mean_b + (b_b * temp_b) + 0.5;
            //qDebug()<<"x:"<<x<<"y:"<<y<<"z:"<<z<<"\n";
            result_r = x;
            result_g = y;
            result_b = z;
            //qDebug()<<"result_r:"<<result_r<<"result_g:"<<result_g<<"result_b:"<<result_b<<"\n";
            //为新图像每个像素赋值
            leeImage->setPixel(i,j,qRgb(result_r,result_g,result_b));
        }
    }
    QLabel *label = new QLabel;
    QLabel *label1 = new QLabel;
    label1->setPixmap(QPixmap::fromImage(*oldImage));
    label1->setWindowTitle("old");
    label1->show();
   
    label->resize(leeImage->width(),leeImage->height());
    label->setPixmap(QPixmap::fromImage(*leeImage));
    label->setWindowTitle("new");
    label->show();
   
    return app.exec();
}

以上为我的Qt写的Lee滤波程序,折腾一个星期了,结果始终不对,希望大家帮忙指点指点!谢谢了!
1 回复
1