嗚嗚喔學習筆記: 10月 2013

搜尋此網誌

2013年10月31日 星期四

MATLAB初體驗(灰階圖rgb2gray(),二值化,負片,旋轉圖像)

1.程式碼(二值化):

    clear all; clc;% 清空
    filepath=['C:\Users\student\Desktop\p123']; %讀圖
    c=imread(filepath,'jpg');%副檔名
    br=rgb2gray(c);%轉成灰階圖
        for(i=1:1:107)%長107
            for(j=1:1:160)%寬160
                  if (c(i,j)>128)%如果大於128 轉成256 白
                     br(i,j)=256;
                  else
                     br(i,j)=1;%小於則黑
                  end
            end
        end
    figure(1),imshow(br);%印出


2.程式碼(負片):
    clear all; clc;
    filepath=['C:\Users\student\Desktop\p123']; 
    c=imread(filepath,'jpg');
    br=rgb2gray(c);
     for(i=1:1:107)
            for(j=1:1:160)     
                br(i,j)=257 - c(i,j);%用257減 
            end
     end
    figure(1),imshow(c);  
    figure(2),imshow(br);


3.程式碼(旋轉):
%旋轉180
    clear all; clc;
    filepath=['C:\Users\student\Desktop\p123']; %讀圖
    c=imread(filepath,'jpg');讀副檔名
     for(i=1:1:107)
            for(j=1:1:160)     
                br(i,j)=c(108-i,161-j);% EX:(1.1)位置值轉給(108-1,161-1)位置
                %以此類推
            end
     end
    figure(1),imshow(c);  
    figure(2),imshow(br);



2013年10月18日 星期五

MATLAB初體驗(全黑,for迴圈)

1.程式碼(hello 印3次):
%印出3次hello
clear all; clc;%清空
for(i=1:1:3)%for(初始值:每次執行的加值:終值)
   fprintf('Hello!\n')%印出

end











2.程式碼(圖片變為全黑):
%把圖片變0
clear all; clc;
filepath=['C:\Users\student\Desktop\caribou'] %路徑%
c=imread(filepath,'tiff');%副檔名tiff
for(i=1:1:256)
   for(j=1:1:256)
      c(i,j)=0;%0=黑 255白
   end
end
figure(1),imshow(c);




3.程式碼(直條濾波):
% y%2 = 0
clear all; clc;
filepath=['C:\Users\student\Desktop\caribou'
c=imread(filepath,'tiff');
for(i=1::256)%for(初始值:每次執行的加值:終值)
   for(j=1:2:256)
      c(i,j)=0;
   end
end
figure(1),imshow(c);


4.程式碼(3+6+9+12+15):
%3+6+9+12+15
clear all; clc;
sum=0
for(i=1:1:5)
    sum=sum+(i*3)

end


2013年10月4日 星期五

MATLAB初體驗(讀圖 放大縮小 混色 補色)





執行方法:





1.程式碼(讀圖):

clear all; clc;%清空%
filepath=['C:\Users\student\Desktop\caribou'] %圖片路徑%
c=imread(filepath,'tiff');%tiff = 副檔名%
imshow(c);%Show出圖片%



2.程式碼(放大縮小):

clear all; clc;
filepath=['C:\Users\student\Desktop\caribou'] %路徑%
x=imread(filepath,'tiff');%副檔名%

x2=imresize(imresize(x,1/2),2);%變 1/2 倍 在變2倍 會模糊圖片%
figure(3),imshow(x2);%輸出figure(3)->x2%

x3=imresize(imresize(x,1/16),16);
figure(4),imshow(x3);




3.程式碼(混色):

clear all; clc;
filepath=['C:\Users\student\Desktop\caribou'] %路徑%
x=imread(filepath,'tiff');%副檔名%
x=double(x);
D=[0 128; 192 64];
r=repmat(D,128,128);
x2=x>r;
imshow(x2);




4.程式碼(補色):
clear all; clc;
filepath=['C:\Users\student\Desktop\caribou'
b=imread(filepath,'tiff');

figure(1),imshow(b);
bc=imcomplement(b);%補色%
figure(2),imshow(bc);


















2013年10月2日 星期三

OPENCV[IplImage* to Mat][Mat to IplImage*]



網路上的文章 常常只有 IplImage   <-> Mat 的型別互換 
但是實際應用 發現需要 IplImage* <-> Mat 的互換
概念大概是先用指標跟位置的關係來寫





程式碼:


#include <cv.h>
#include <highgui.h>
#include <stdio.h>

using namespace cv ;
int main()
{
     //IplImage*  -> 轉換 Mat
     IplImage* img01 = cvLoadImage("apple.jpg",1);//IplImage*讀取圖片
     Mat Mimg01(img01, 0);//丟給MAT

     cvNamedWindow("img01",0);
     imshow("img01", Mimg01);
     
     //*****************************************



     //Mat -> 轉換 IplImage*
     Mat Mimg02 = imread("lena.jpg", 1);//Mat型別讀取圖片
     IplImage* img02 ;                  //先宣告 IplImage* 型別的img02
     img02 = &IplImage(Mimg02);         //Matimg的位置丟給img02

     cvNamedWindow("img02",0);
     cvShowImage("img02",img02);
      


     cvWaitKey(0);

}

結果:
參考:

2013年10月1日 星期二

OPENCV[背景相減法]{cvAbsDiff(img1,img2,img3);}

背景相減法實作










程式碼 :


#include <cv.h>
#include <highgui.h>
#include "Header.h"

void BW(IplImage* img , int RGB )//二值化
{
  int Height=cvGetDimSize(img,0);//讀取矩陣高度
  int Width=cvGetDimSize(img,1);//讀取矩陣寬度

  //背景相減後二值化
  for(int y = 0 ; y < Height ; y++)
  for(int x = 0 ; x < Width ; x++ )
  {
               if(!(cvGet2D(img, y , x ).val[2] < RGB 
                 && cvGet2D(img, y , x ).val[1] < RGB 
                 && cvGet2D(img, y , x ).val[0] < RGB))
                    cvSet2D(img,y,x,CV_RGB(255,255,255));//特別注意 給值是 (y,x)
               else
                    cvSet2D(img,y,x,CV_RGB(0,0,0));//特別注意 給值是 (y,x)

  }
}
int main(int argc, char *argv[])
{
  IplImage* img1, *img2, *img3;

  img1=cvLoadImage("D:/image/car/p200.JPG",0);
  img2=cvLoadImage("D:/image/car/p1800.JPG",0);
  //分別給loading兩個圖片
  //先轉換為灰階 0

   //fun(10);
 
  if(!img1 || !img2)//判斷有無讀取到
  {
    printf("Could not load image file\n");
           system("pause");
    exit(0);
  }
 
  img3 = cvCreateImage(cvGetSize(img1),img1->depth,img1->nChannels);
  //建立新圖片img3 仿冒 img1
  cvSmooth(img1, img1, CV_GAUSSIAN, 3, 0, 0);//平滑處理
  cvSmooth(img2, img2, CV_GAUSSIAN, 3, 0, 0);
  cvAbsDiff(img1,img2,img3);
  //做背景相減


  int Height=cvGetDimSize(img3,0);//讀取矩陣高度
  int Width=cvGetDimSize(img3,1);//讀取矩陣寬度

  BW(img3 ,40);//二值化
  
   cvErode(img3,img3,0,1);//cvErode(輸入圖像,輸出圖像,element,腐蝕的次數);
   cvDilate(img3,img3,0,1);//擴張
  

  cvSaveImage("D:/image/car/ADS.PNG", img3);
  //img3 = saturate_sv(img3);


  //img3 = saturate_sv(img3);
  //2值化用 目前這裡用不到

  //開視窗 顯示 釋放
  cvNamedWindow("img1", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("img2", CV_WINDOW_AUTOSIZE);
  cvNamedWindow("img3", CV_WINDOW_AUTOSIZE);
  cvShowImage("img1", img1 );
  cvShowImage("img2", img2 );
  cvShowImage("img3", img3 );
  cvWaitKey(0);
  cvReleaseImage(&img1);
  cvReleaseImage(&img2);
  cvReleaseImage(&img3);
  return 0;


}