1. 程式人生 > >影象處理之qt實現

影象處理之qt實現

  1. #include \"mainwindow.h\"
  2. #include \"ui_mainwindow.h\"
  3. #include <QFileDialog>
  4. #include <QMovie>
  5. #include <QRgb>
  6. #include <math.h>
  7. #include <QInputDialog>
  8. #include <QDebug>
  9. #include <QDialog>
  10. #include <QDoubleSpinBox>
  11. #include <QSpinBox>

  12. #include <QLabel>
  13. MainWindow::MainWindow(QWidget *parent) :
  14.     QMainWindow(parent),
  15.     ui(new Ui::MainWindow)
  16. {
  17.     ui->setupUi(this);
  18.     QMenu *editMenu=ui->menuBar->addMenu(QObject::tr(\"圖片(&P)\"));
  19.     QAction *action_Open=editMenu->addAction(QObject::tr(\"開啟圖片&O\"
    ));
  20.     QMenu *editMenuMake=ui->menuBar->addMenu(QObject::tr(\"影象幾何變換(&M)\"));
  21.     QAction *action_Make1=editMenuMake->addAction(QObject::tr(\"影象平移(&T)\"));
  22.     QAction *action_Make2=editMenuMake->addAction(QObject::tr(\"影象放縮(&S)\"));
  23.     QMenu *editMenuBetter=ui->menuBar-
    >addMenu(QObject::tr(\"影象增強(&B)\"));
  24.     QAction *action_Better1=editMenuBetter->addAction(QObject::tr(\"影象銳化(&E)\"));
  25.     QAction *action_Better2=editMenuBetter->addAction(QObject::tr(\"直方圖均衡化(&A)\"));
  26.     QAction *action_Better3=editMenuBetter->addAction(QObject::tr(\"消除噪聲(&D)\"));
  27.     QMenu *editMenuTiqu=ui->menuBar->addMenu(QObject::tr(\"提取(&G)\"));
  28.     QAction *action_Gray=editMenuTiqu->addAction(QObject::tr(\"影象灰度化\"));
  29.     QAction *action_Get1=editMenuTiqu->addAction(QObject::tr(\"Sobel運算元提取\"));
  30.     action_Open->setCheckable(true);
  31.     action_Make1->setCheckable(true);
  32.     action_Make2->setCheckable(true);
  33.     action_Better1->setCheckable(true);
  34.     action_Better2->setCheckable(true);
  35.     action_Better3->setCheckable(true);
  36.     action_Gray->setCheckable(true);
  37.     action_Get1->setCheckable(true);
  38.     connect(action_Open,SIGNAL(triggered()),this,SLOT(OpenPicture()));
  39.     connect(action_Make1,SIGNAL(triggered()),this,SLOT(SetChangeValue()));
  40.     connect(action_Make2,SIGNAL(triggered()),this,SLOT(SetSouValue()));
  41.     connect(action_Better1,SIGNAL(triggered()),this,SLOT(SetBetterValue()));
  42.     connect(action_Better2,SIGNAL(triggered()),this,SLOT(MakePicAverage()));
  43.     connect(action_Gray,SIGNAL(triggered()),this,SLOT(RgbToGray()));
  44.     connect(action_Get1,SIGNAL(triggered()),this,SLOT(SobelGet()));
  45.     connect(action_Better3,SIGNAL(triggered()),this,SLOT(SelectYanKind()));
  46. }
  47. MainWindow::~MainWindow()
  48. {
  49.     delete ui;
  50. }
  51. //獲取要處理的影象並顯示出來
  52. void MainWindow::OpenPicture()
  53. {
  54.     fileName=QFileDialog::getOpenFileName( this,tr(\"開啟檔案\"),\"/usr/local/Trolltech\",
  55.                                                    tr(\"任何檔案(*.*)\"\";;文字檔案(*.txt)\"\";;XML檔案(*.xml)\"\";;Images (*.png *.xpm *.jpg)\"));
  56.     QMovie *move=new QMovie(fileName);
  57.     ui->label->move(50,100);
  58.     ui->label->setMovie(move);
  59.     move->start();
  60. }
  61. //確定影象左右、上下的平移量,並觸發平移函式
  62. void MainWindow::SetChangeValue()
  63. {
  64.     dialog=new QDialog(this);
  65.     QLabel *WidthLabel=new QLabel(dialog);
  66.     WidthLabel->move(30,50);
  67.     WidthLabel->setText(tr(\"設定寬度的平移量\"));
  68.     setWidthChange=new QSpinBox(dialog);
  69.     setWidthChange->setMaximum(20);
  70.     setWidthChange->setMinimum(-20);
  71.     setWidthChange->move(180,50);
  72.     QLabel *HeightLabel=new QLabel(dialog);
  73.     HeightLabel->move(30,80);
  74.     HeightLabel->setText(tr(\"設定高度的平移量\"));
  75.     setHeightChange=new QSpinBox(dialog);
  76.     setHeightChange->setMaximum(20);
  77.     setHeightChange->setMinimum(-20);
  78.     setHeightChange->move(180,80);
  79.     QPushButton *button=new QPushButton(dialog);
  80.     button->move(180,120);
  81.     button->setText(tr(\"確定\"));
  82.     dialog->show();
  83.     connect(button,SIGNAL(clicked()),this,SLOT(ShowChangePic()));
  84. }
  85. //平移函式
  86. void MainWindow::ShowChangePic()
  87. {
  88.     image=new QImage(fileName);
  89.     QImage ChangeImage;
  90.     ChangeImage=QImage(image->width(),image->height(),QImage::Format_ARGB32);
  91.     QRgb rgb;
  92.     int width,height;
  93.     int i,j;
  94.     int widthOffset,heightOffset;
  95.     width=image->width();
  96.     height=image->height();
  97.     widthOffset=setWidthChange->value();
  98.     heightOffset=setHeightChange->value();
  99.     for(i=0;i<width;i++)
  100.     {
  101.         for(j=0;j<height;j++)
  102.         {
  103.             rgb=image->pixel(i,j);
  104.             if(ChangeImage.valid(i+widthOffset,j+heightOffset))
  105.             {
  106.                 ChangeImage.setPixel(i+widthOffset,j+heightOffset,rgb);
  107.             }
  108.         }
  109.      }
  110.      ui->label_2->resize(ChangeImage.width(),ChangeImage.height());
  111.      ui->label_2->setPixmap(QPixmap::fromImage(ChangeImage));
  112.      delete image;
  113.      delete dialog;
  114. }
  115. //設定影象伸縮的比例並觸發伸縮函式
  116. void MainWindow::SetSouValue()
  117. {
  118.     dialog=new QDialog(this);
  119.     QLabel *WidthLabel=new QLabel(dialog);
  120.     WidthLabel->move(30,50);
  121.     WidthLabel->setText(tr(\"設定寬度的縮放比例\"));
  122.     setWidthBi=new QDoubleSpinBox(dialog);
  123.     setWidthBi->setMaximum(20);
  124.     setWidthBi->setMinimum(0.1);
  125.     setWidthBi->move(180,50);
  126.     QLabel *HeightLabel=new QLabel(dialog);
  127.     HeightLabel->move(30,80);
  128.     HeightLabel->setText(tr(\"設定高度的縮放比例\"));
  129.     setHeightBi=new QDoubleSpinBox(dialog);
  130.     setHeightBi->setMaximum(20);
  131.     setHeightBi->setMinimum(0.1);
  132.     setHeightBi->move(180,80);
  133.     QPushButton *button=new QPushButton(dialog);
  134.     button->move(180,120);
  135.     button->setText(tr(\"確定\"));
  136.     dialog->show();
  137.     connect(button,SIGNAL(clicked()),this,SLOT(ShowSouPic()));
  138. }
  139. //伸縮函式
  140. void MainWindow::ShowSouPic()
  141. {
  142.     int width,height;
  143.     image=new QImage(fileName);
  144.     width=image->width();
  145.     height=image->height();
  146.     double x,y,r1,r2,g1,g2,b1,b2;
  147.     int i,j;
  148.     double width_bi,height_bi;
  149.     QRgb rgb00,rgb01,rgb10,rgb11;
  150.     int r,g,b;
  151.     QImage SouImage;
  152.     width_bi=setWidthBi->value();
  153.     height_bi=setHeightBi->value();
  154.     SouImage=QImage(width*width_bi,height*height_bi,QImage::Format_ARGB32);
  155.     for(i=0;i<width*width_bi;i++)
  156.     {
  157.         for(j=0;j<height*height_bi;j++)
  158.         {
  159.             x=i*(1/width_bi);
  160.             y=j*(1/height_bi);
  161.             //邊界採用單線性插值
  162.             if(ceil(x)==0&&ceil(y)!=0)
  163.             {
  164.                 rgb00=image->pixel(0,ceil(y)-1);
  165.                 rgb01=image->pixel(0,ceil(y));
  166.                 r=(ceil(y)-y)*qRed(rgb00)+(y-(ceil(y)-1))*qRed(rgb01);
  167.                 g=(ceil(y)-y)*qGreen(rgb00)+(y-(ceil(y)-1))*qGreen(rgb01);
  168.                 b=(ceil(y)-y)*qBlue(rgb00)+(y-(ceil(y)-1))*qBlue(rgb01);
  169.                 SouImage.setPixel(i,j,qRgb(r,g,b));
  170.             }
  171.             if(ceil(y)==0&&ceil(y)!=0)
  172.             {
  173.                 rgb00=image->pixel(ceil(x)-1,0);
  174.                 rgb10=image->pixel(ceil(x),0);
  175.                 r=(ceil(x)-x)*qRed(rgb00)+(x-(ceil(x)-1))*qRed(rgb10);
  176.                 g=(ceil(x)-x)*qGreen(rgb00)+(x-(ceil(x)-1))*qGreen(rgb10);
  177.                 b=(ceil(x)-x)*qBlue(rgb00)+(x-(ceil(x)-1))*qBlue(rgb10);
  178.                 SouImage.setPixel(i,j,qRgb(r,g,b));
  179.             }
  180.             //(0,0)點特殊處理
  181.             if(ceil(y)==0&&ceil(y)==0)
  182.             {
  183.                 rgb00=image->pixel(0,0);
  184.                 SouImage.setPixel(i,j,rgb00);
  185.             }
  186.             //非邊界採用雙線性插值
  187.             if(ceil(x)!=0&&ceil(y)!=0)
  188.             {
  189.                 rgb00=image->pixel(ceil(x)-1,ceil(y)-1);
  190.                 rgb01=image->pixel(ceil(x)-1,ceil(y));
  191.                 rgb10=image->pixel(ceil(x),ceil(y)-1);
  192.                 rgb11=image->pixel(ceil(x),ceil(y));
  193.                 r1=(ceil(x)-x)*qRed(rgb00)+(x-(ceil(x)-1))*qRed(rgb10);
  194.                 r2=(ceil(x)-x)*qRed(rgb01)+(x-(ceil(x)-1))*qRed(rgb11);
  195.                 r=(int)((ceil(y)-y)*r1+(y-(ceil(y)-1))*r2);
  196.                 g1=(ceil(x)-x)*qGreen(rgb00)+(x-(ceil(x)-1))*qGreen(rgb10);
  197.                 g2=(ceil(x)-x)*qGreen(rgb01)+(x-(ceil(x)-1))*qGreen(rgb11);
  198.                 g=(int)((ceil(y)-y)*g1+(y-(ceil(y)-1))*g2);
  199.                 b1=(ceil(x)-x)*qBlue(rgb00)+(x-(ceil(x)-1))*qBlue(rgb10);
  200.                 b2=(ceil(x)-x)*qBlue(rgb01)+(x-(ceil(x)-1))*qBlue(rgb11);
  201.                 b=(int)((ceil(y)-y)*b1+(y-(ceil(y)-1))*b2);
  202.                 SouImage.setPixel(i,j,qRgb(r,g,b));
  203.             }
  204.         }
  205.     }
  206.     ui->label_2->resize(SouImage.width(),SouImage.height());
  207.     ui->label_2->setPixmap(QPixmap::fromImage(SouImage));
  208.     delete image;
  209.     delete dialog

    相關推薦

    影象處理qt實現

    #include \"mainwindow.h\" #include \"ui_mainwindow.h\" #include <QFileDialog> #include <QMovie> #include <QRgb> #include <math.

    數字影象處理空間域濾波和銳化(Octave實現

    濾波這一概念可以結合數字訊號處理這一領域中的濾波。而在數字影象處理中濾波可以分為空間域濾波和頻率域濾波。這篇博文主要來學習下空間域濾波。 空間域濾波機理 *空間濾波器由一個鄰域(典型的是一個較小的矩形)構成,對該鄰域所包圍的畫素按照一定的操作計算出目標畫素的值,這一過程就是空

    影象處理影象基本變化(平移、縮放、旋轉)(Octave實現

    在模式識別及計算機視覺中,要經常進行影象的變化。 例如:在識別手寫數字中,我們可能在廣泛應用中要求所有的圖片都是20*20這麼好的規格。所以,我們就需要進行縮放來達到目的。 今天來總結下學到的影象的基本變換。 首先我們計 (w,v) (w,v)為源影象的

    圖形影象處理——實現影象子區域影象的簡單提取

               今天經過高人點醒,我好想懂了點點我要做的東東的思路,今天晚上就拿出來試了一下,居然還小小的實現了一番,太開心了,迫不及待的拿出來分享一下: 不過當然還沒有完全實現,還需要進一步的設計批量操作。程式碼貼出來: image=imread('E:\qww

    影象處理直方圖均衡MATLAB程式碼實現

    MATLAB畫灰度影象直方圖的程式碼 I=imread('cameraman.tif'); [M N]=size(I);%求出圖片大小 y=zeros(1,256) x=0:255; for t=0:255 for i=1:M for j=1:N

    轉《影象處理表面濾波》

    本文介紹經典的表面模糊Surface Blur演算法與實現。 表面模糊是PS裡一個重要的保邊濾波器,它的演算法很簡單,公式如下所示: 主要思想還是計算當前畫素X的鄰域範圍內不同畫素的加權求和,邊緣地方的畫素,加權比較大,平滑的地方加權比較小,以此來保留邊緣資訊,平滑平坦區域; 效果如下圖所示:

    影象處理---光流法

    LK光流演算法公式詳解: 由於工程需要用到 Lucas-Kanade 光流,在此進行一下簡單整理(後續還會陸續整理關於KCF,PCA,SVM,最小二乘、嶺迴歸、核函式、dpm等等): 光流,簡單說也就是畫面移動過程中,影象上每個畫素的x,y位移量,比如第t幀的時候A點的位置是(x1,

    影象處理積分圖應用四(基於區域性均值的影象二值化演算法)

    影象處理之積分圖應用四(基於區域性均值的影象二值化演算法) 基本原理 均值法,選擇的閾值是區域性範圍內畫素的灰度均值(gray mean),該方法的一個變種是用常量C減去均值Mean,然後根據均值實現如下操作: pixel = (pixel > (mean - c)) ? ob

    影象處理積分圖應用三(基於NCC快速相似度匹配演算法)

    影象處理之積分圖應用三(基於NCC快速相似度匹配演算法) 基於Normalized cross correlation(NCC)用來比較兩幅影象的相似程度已經是一個常見的影象處理手段。在工業生產環節檢測、監控領域對物件檢測與識別均有應用。NCC演算法可以有效降低光照對影象比較結果的影響。而

    影象處理積分圖應用二(快速邊緣保留濾波演算法)

    影象處理之積分圖應用二(快速邊緣保留濾波演算法) 一:基本原理 傳統的影象邊緣保留濾波演算法-如高斯雙邊模糊、Mean-Shift模糊等計算複雜、效率比較低,雖然有各種手段優化或者快速計算方法,當時演算法相對一般碼農來說理解起來比較費勁,不是一個的選擇,而通過積分影象實現區域性均方差

    影象處理積分圖應用一(半徑無關的快速模糊演算法)

    影象處理之積分影象應用一(半徑無關的快速模糊演算法) 一:基本原理概述 傳統的影象空間域卷積模糊演算法,當視窗大小改變時卷積模糊時間也會變化,而且隨著視窗尺寸越大計算量也越大,演算法執行時間約越長。在很多時候無法滿足實時性要求。而基於積分影象可以實現對視窗區域和大小的快速計算,把傳統卷積

    影象處理積分圖演算法

    影象處理之積分圖演算法 一:積分圖來源與發展 積分影象是Crow在1984年首次提出,是為了在多尺度透視投影中提高渲染速度。隨後這種技術被應用到基於NCC的快速匹配、物件檢測和SURF變換中、基於統計學的快速濾波器等方面。積分影象是一種在影象中快速計算矩形區域和的方法,這種演算法主要優點

    數字影象處理直方圖均衡化(Octave)

    直方圖的均衡化是什麼呢? 舉個簡單的例子:在一個圓中有很多石頭,都集中在圓心附近,對其均衡化就是讓這些石頭儘可能的均勻分佈在圓這個區域內。 並且還有一個原則:如果石頭A在原來狀態下距離圓心的距離在所有石頭是第4位,那麼均衡化後仍然是第4位,相對順序不能變。(大概就是一個拉的更寬了)

    java影象處理001---java實現雨滴頭像效果_可以放在地圖上使用_自動生成雨滴頭像

      JAVA技術交流QQ群:170933152    公開啦,看看有沒有幫助,分享吧   處理前的三張圖片:         實現了下面這種效果:  &

    影象處理特徵提取

    知乎上看到一個話題——目前火熱的 Deep Learning 會滅絕傳統的 SIFT / SURF 特徵提取方法嗎? 由於之前研究過SIFT和HOG這兩種傳統的特徵提取方法,故本篇文章先對SIFT和HOG作一綜述,並比較二者優缺點。之後,將SIFT和HOG同神經網路特徵提取做一對比,淺談對上

    影象處理gamma校正

    轉載自:淇淇寶貝:影象處理之gamma校正 1 gamma校正背景   在電視和圖形監視器中,映象管發生的電子束及其生成的影象亮度並不是隨映象管的輸入電壓線性變化,電子流與輸入電壓相比是按照指數曲線變化的,輸入電壓的指數要大於電子束的指數。這說明暗區的訊號要比實際情況更暗,而亮區要

    影象處理修復

    對黑色空洞區域進行處理,輸出影象尺寸為[768,1024,3] 然後利用以下得到影象 水平太菜,改了兩天才改成這個鬼樣子 後來想到col=768,row=1024,應該是768行,1024列,然後把順序顛倒過來了 還是有問題繼續處理: 發現是RGB三

    FPGA影象處理行快取(linebuffer)的設計一 FPGA影象處理行快取(linebuffer)的設計一

    轉載: FPGA影象處理之行快取(linebuffer)的設計一 FPGA影象處理之行快取(linebuffer)的設計一 作者:OpenS_Lee   1 背景知識     在FPGA數字影象處理中,行快取的使用非常頻繁,

    影象處理——卷積

    vImage學習筆記——卷積(Convolution) 卷積(Convolution)是一個常用的影象處理技術,可以改變畫素強度,從而影響周圍其他畫素的強度。卷積的常用技術是建立濾鏡,使用卷積技術,你可以獲取一些流行的影象效果,比如模糊(blur)、銳化(sharpen)及邊緣檢測(edge d

    20180911影象處理霍夫變換

    原理介紹 霍夫變換在檢測各種形狀的的技術中非常流行,如果你要檢測的形狀可以用數學表示式寫出,你就可以是使用霍夫變換檢測它。及時要檢測的形狀存在一點破壞或者扭曲也可以使用。我們下面就看看如何使用霍夫變換檢測直線。 一條直線可以用數學表示式y = mx + c 或者 = x