這學期最大的收穫 就是大開眼見
在還沒有做影像處理開始,我以為影像處理就只是 把影像做P圖的動作
開始接觸到影像處理時,發現影像處理可以做的東西很多、市場很大且擁有無限的潛力。
從第一個作業 APP開始說起,第一個作業談到影像接合,影像接合是將多張影像合併成一張圖片,透過演算法不斷的調整,讓影像得邊緣不會因為接合而露出破綻,讓使用者可以把周圍所有景色都拍進相片裡,這項技術也造就近期的FB與youtube當紅的360VR影片,讓使用者就像身入其境一樣慣看整支影片,透過滑鼠或是手機的陀螺儀來觀看不同角度的影片。
第二個作業 直方圖均化,透過統計各顏色的數量,再將每個顏色的對比度個別拉高,可以使看起來霧霧的或者是影像看起來很暗的影像看起來變成比較清楚。
第三個作業 Level&Curve,Level透過限制影像的輸入輸出最高值與最小值,用以提高與降低影像的對比度,而Curve用數學的方式去改變影像原本的色彩值,讓原本影像較暗的地方經過使用者自定可以變亮,因為是曲線的緣故修改後的圖片不會因此改變而看起來變得很奇怪。
第四個作業 就是3D攝影比賽,將一張影像取出紅色的部分另外一章取出藍綠色的部分,並將此兩張的影像疊在一起,透過3D眼鏡觀看經過大腦的處理,看起來就像是影像中的東西浮現在眼前一樣,而此次作業經過研究後發現在焦點前面的物件紅色影像會在左邊而青色影像會在右邊,在焦點後面的影像紅色影像會在右邊而青色影像會在左邊,而如果再處理影像時刻意把紅色跟青色的影像拉開,會發現影像會變得更立體,前後差距也會變得更大。
現在也有人開始專空VR的市場,透過VR的眼鏡讓兩眼個別看兩種不同的彩色影像(這與一般3D不一樣),這樣看起來影像也會更真實,且VR眼鏡裡面有陀螺儀使用著戴著眼鏡轉頭就會看像不同的方向的影片,讓使用者更深入其境真實性更高。
第五個作業 空間濾波,平滑空間濾波器可以將影像的去掉銳利化,讓原本坑坑疤疤的月亮變成毫無瑕疵的月亮,而銳化空間濾波器則是相反讓月亮變得更凹凸不平,而中值濾波器則是將影像中的雜訊點消除
第六個作業 色彩模型,透過YUV的公式對影像做調整,Y值的為亮度值負責幫影像把影像原有輪廓給鎖定住,再利用UV值的改變讓影像擁有不同色彩。
其實在以上作業都可以發現一個共通點,其實影像處理的程式都不會太困難,但卻可以帶來很大的改變,像是RGB轉成灰階,以前的我從來沒有想過為什麼講RGB的值都設成一樣的數值影像會變成灰色,也沒有想過為何將兩個影像一個取出R一個取出GB和起來看會有3D的效果,而經過了解之後發現其實原理都不難,這些都是前人不斷的嘗試與研究而言就出來的理論,修過這堂課後我比以前更愛影像處理了,以前總是覺得影像處理沒什麼,真正的了解之後發現我錯了,影像處理就像是宇宙一樣無窮無盡,等待著熱愛影像處理的人去探索與研究。
2016年1月13日 星期三
2016年1月7日 星期四
資工三乙 02360386 柯明男 HW5
題目:Color Models
1.RGB色彩模型
原理:分成RGB三個切面
每個R切面就是 R值固定 BG從0~255
我做了功能 可以用輸入的 也可以用trackbar拉 也可以點圖選顏色
因為 這三個功能 RGB 都適用
每個R切面就是 R值固定 BG從0~255
我做了功能 可以用輸入的 也可以用trackbar拉 也可以點圖選顏色
因為 這三個功能 RGB 都適用
所以就可以用 Sender 方便程式撰寫
例如:
講三個Edit都只像同一個事件
void __fastcall TForm1::TrackBar1Change(TObject *Sender)//呼叫事件時 會傳入一個Sender
TEdit * TE = (TEdit*)Sender; //Sender 會知道誰傳過來的
if(TE->Name == "Edit6") //藉由判斷知道 Edit的改變 要去修改甚麼
{
TB = TrackBar1;
}
else if(TE->Name == "Edit7")
{
TB = TrackBar2;
}
else if(TE->Name == "Edit8")
{
TB = TrackBar3;
}
if(CheckTextIsNum(TE->Text)) //透過之前的程式 用來判斷是不是數字
{
if(TE->Text>=0 && TE->Text<=255)判斷 輸入的數字會不會超過0~255
{
TB->Position = StrToInt(TE->Text);
ShowRGB(TrackBar1->Position,TrackBar2->Position,TrackBar3->Position);
//顯示RGB3個切面
}
}
原理:將影像RGB透過公式轉換成YUV 以方便進行一些處理
也有其他轉換 例如: YCbCr (兩著的Y 都為亮度)
而這次使用的方式是 將Y固定 然後使用者選擇UV
這樣原始影像 樣子會留靠著Y留著 而 色彩值會隨者UV的變化而有不同效果
這樣原始影像 樣子會留靠著Y留著 而 色彩值會隨者UV的變化而有不同效果
1.固定Y值 畫出UV 0~255的圖
會超快0~255 所以記得調整 其他沒有甚麼太大的問題 跟 RGB一樣的作法
Y為128時
Y 為255時
2.將圖讀出來 透過調整UV 來作調整
本次作業最大的BUG出現
Y = ((B*25+G*129+R*66+128)>>8)+16; 這裡的>>8+16
一定要用()分開 如果不分開 會配判斷成往右shift24次 這樣 怎麼都會是0
其他基本上沒有甚麼太大的問題
此外可以在滑鼠點的位置點個紅點好分辨點哪個位子
成果:
YUV都為128時 為灰階
影像的色彩為滑鼠點的地方
程式碼:點我
2015年12月16日 星期三
資工三乙 02360386 柯明男 HW4
作業內容:Filter
Smoothing Spatial Filter (平滑空間濾波器):
讓影像模糊化(平滑化,去銳利化)
原理:減少與周圍的差距 遵循以下比例 把周為的點還有自己都加起來 然後除16
圖1.平滑的遮罩
小問題:當遇到邊邊該怎麼辦
我的作法是 當遇到邊邊 利如(-1,-1) ,(-1,0),(-1,1),(0,-1),(1,-1) 就直接跳過而這樣也會相對的 最後要除的數字多寡
另外 因為怕會因為修改前面而影響到後面 所以 我有被分一份原始圖片
程式嗎如下:
unsigned char mask[3][3] = {{1,2,1},{2,4,2},{1,2,1}};
int maskSum;
int Sum[3];
BYTE **bPtrImageRow = new BYTE*[iImageHeight]; // 原始圖片的2維陣列宣告
for(int j=0; j<iImageHeight; j++)
{
bPtrImageRow[j] = (Byte *)Image2->Picture->Bitmap->ScanLine[j];
}
for(int i=0; i<iImageHeight; i++)
{
BYTE *bPtrImage2Row = (Byte *)Image4->Picture->Bitmap->ScanLine[i];
//要修改圖片的宣告
for(int j=0; j<iImageWidth; j++)
{
maskSum=0;//計算最後要除的量
Sum[0]=0;//B
Sum[1]=0;//G
Sum[2]=0;//R
for(int h=0;h<3;h++)
{
for(int w=0;w<3;w++)
{
//防止出界
if((i-1+h)>=0 && (i-1+h)<iImageHeight && (j-1+w)>=0 && (j-1+w)<iImageWidth)
{
for(int k=0;k<3;k++)
Sum[k]+=bPtrImageRow[i-1+h][(j-1+w)*3+k]*mask[h][w];
maskSum+=mask[h][w];
}
}
}
for(int k=0;k<3;k++)
bPtrImage2Row[j*3+k]=Sum[k]/maskSum;
}
}
圖2.平滑的效果 稍為可以看出有比較模糊一點
Sharping Spatial Filter(銳化空間濾波器)
讓影像的邊邊可以更明顯
原裡:增加與周圍的差距
圖3.銳化的遮罩
小問題:有可能會超過 0,255 其他基本上沒問題
程式碼如下:Image4->Picture=Image2->Picture;
int Sum[3];
BYTE **bPtrImageRow = new BYTE*[iImageHeight];
for(int j=0; j<iImageHeight; j++)
{
bPtrImageRow[j] = (Byte *)Image2->Picture->Bitmap->ScanLine[j];
}
for(int i=0; i<iImageHeight; i++)
{
BYTE *bPtrImage2Row = (Byte *)Image4->Picture->Bitmap->ScanLine[i];
for(int j=0; j<iImageWidth; j++)
{
Sum[0]=0;//B
Sum[1]=0;//G
Sum[2]=0;//R
for(int h=0;h<3;h++)
{
for(int w=0;w<3;w++)
{
if((i-1+h)>=0 && (i-1+h)<iImageHeight && (j-1+w)>=0 && (j-1+w)<iImageWidth)
{
for(int k=0;k<3;k++)
Sum[k]+=(bPtrImageRow[i][j*3+k]-bPtrImageRow[i-1+h][(j-1+w)*3+k]);
}
}
}
for(int k=0;k<3;k++)
{//防止超過0,255 另外這裡多加1次 是因為上面只+8次
if(Sum[k]+bPtrImageRow[i][j*3+k]<0)
bPtrImage2Row[j*3+k]=0;
else if(Sum[k]+bPtrImageRow[i][j*3+k]>255)
bPtrImage2Row[j*3+k]=255;
else
bPtrImage2Row[j*3+k]=Sum[k]+bPtrImageRow[i][j*3+k];
}
}
}
圖4.銳化的效果 Lenna的帽子跟頭髮都比較明顯了
Median Filter(中值濾波器)
去除圖片的雜訊原裡:雜訊通常是圖片中 較為極端的點
而中值濾波器 是去3*3裡面的中位數 可以去除較為極端的點
小問題:怎麼找中位數(好像也是不是問題
Image4->Picture=Image2->Picture;BYTE **bPtrImageRow = new BYTE*[iImageHeight];
vector<vector<int> >temp(3,vector<int>());//二維的vector宣告
for(int j=0; j<iImageHeight; j++)
{
bPtrImageRow[j] = (Byte *)Image2->Picture->Bitmap->ScanLine[j];
}
for(int i=0; i<iImageHeight; i++)
{
BYTE *bPtrImage2Row = (Byte *)Image4->Picture->Bitmap->ScanLine[i];
for(int j=0; j<iImageWidth; j++)
{
temp[0].clear();//清除vector的內容
temp[1].clear();
temp[2].clear();
for(int h=0;h<3;h++)
{
for(int w=0;w<3;w++)
{
if((i-1+h)>=0 && (i-1+h)<iImageHeight && (j-1+w)>=0 && (j-1+w)<iImageWidth)
{
for(int k=0;k<3;k++)
//將數字丟進vector最後面
temp[k].push_back(bPtrImageRow[i-1+h][(j-1+w)*3+k]);
}
}
}
for(int k=0;k<3;k++)
{
sort(temp[k].begin(),temp[k].end()); //將3個vector 排序
if(temp[k].size()%2) //當是奇數值 中位數就是正中間的那個數字
{
bPtrImage2Row[j*3+k] = temp[k][temp[k].size()/2];
}
else //偶數時 則是把中間的兩個數相加除二
{
bPtrImage2Row[j*3+k] = (temp[k][temp[k].size()/2]+temp[k][temp[k].size()/2-1])/2;
}
}
}
}
內鍵sort(陣列頭,陣列尾) 要include <algorithm>還要 using namespace std;
以下是灑入雜訊的程式碼:
int num=StrToInt(Edit5->Text);
BYTE **bPtrImageRow = new BYTE*[iImageHeight];
for(int j=0; j<iImageHeight; j++)
{
bPtrImageRow[j] = (Byte *)Image2->Picture->Bitmap->ScanLine[j];
}
for(int i=0; i<iImageHeight; i++)
{
for(int j=0; j<iImageWidth; j++)
{
if(rand()%100<num/2)
{
for(int k=0;k<3;k++)
bPtrImageRow[i][j*3+k]=0; //灑白點
}
if(rand()%100>=100-num/2)
{
for(int k=0;k<3;k++)
bPtrImageRow[i][j*3+k]=255; //灑黑點
}
}
}
Image2->Refresh();//如果沒有打會看不出已經灑點了!!
圖5.灑6%雜訊 去雜訊的效果非常的好
圖6.灑20%雜訊 去雜訊效果也是非常好 不過此時可以很明顯看出有雜訊
程式碼:點我
2015年11月18日 星期三
資工三乙 02360386 柯明男 HW3
作業內容:Level & Curve
PageControl:
因為不想把之前的東西刪掉,所以新增了PageControl,做分頁的動作。
圖片1.新增分頁
如果想要修改分頁名稱,要先點想要修改的分頁,然後按框框內的部分,在從屬性caption修改。
圖片2.修改分頁名稱
Level: 藉由縮小輸入輸出的最小最大值,來增加圖片的對比或是縮小。
作法:我是用最大和最小值的改變進而去修改圖片和畫圖,4個事件用同一個就可以了。
圖片3.新增事件
會遇到的問題:
1.當框框內的沒有任何值
2.當框框內的值不是數字
解決程式碼:
寫個function判斷,如果不是數字就回傳false
bool CheckTextIsNum()
{
String str[4];
str[0]=Form1->Edit1->Text;
str[1]=Form1->Edit2->Text;
str[2]=Form1->Edit3->Text;
str[3]=Form1->Edit4->Text;
for(int i=0;i<4;i++)
if(str[i].Length()==0) return false;//判斷是不是空白
for(int i=0;i<4;i++)
{
{
String str[4];
str[0]=Form1->Edit1->Text;
str[1]=Form1->Edit2->Text;
str[2]=Form1->Edit3->Text;
str[3]=Form1->Edit4->Text;
for(int i=0;i<4;i++)
if(str[i].Length()==0) return false;//判斷是不是空白
for(int i=0;i<4;i++)
{
//String陣列開始是1喔!! 我這裡大概卡了20分鐘QQ
for(int j=1;j<=str[i].Length();j++)
{
if(str[i][j]<48 || str[i][j]>57)
return false;
}
}
return true;
}
if(str[i][j]<48 || str[i][j]>57)
return false;
}
}
return true;
}
3.畫圖
基本上沒有甚麼太大的問題,就是分3段畫。
程式碼:
if(CheckTextIsNum())
{
inputmin=StrToInt(Edit1->Text);
inputmax=StrToInt(Edit2->Text);
outputmin=StrToInt(Edit3->Text);
outputmax=StrToInt(Edit4->Text);
if(inputmin>=0 && inputmax>inputmin && outputmin>=0 &&
{
inputmin=StrToInt(Edit1->Text);
inputmax=StrToInt(Edit2->Text);
outputmin=StrToInt(Edit3->Text);
outputmax=StrToInt(Edit4->Text);
if(inputmin>=0 && inputmax>inputmin && outputmin>=0 &&
outputmax>outputmin && inputmax<=255 && outputmax<=255)//判斷 max<min
{
Image8->Canvas->Rectangle( TRect(-2, -2,257, 257));
Image8->Canvas->MoveTo(0,255-outputmin);
Image8->Canvas->LineTo(inputmin,255-outputmin);
Image8->Canvas->LineTo(inputmax,255-outputmax);
Image8->Canvas->LineTo(255,255-outputmax);
meiwunti=true;
}
}
{
Image8->Canvas->Rectangle( TRect(-2, -2,257, 257));
Image8->Canvas->MoveTo(0,255-outputmin);
Image8->Canvas->LineTo(inputmin,255-outputmin);
Image8->Canvas->LineTo(inputmax,255-outputmax);
Image8->Canvas->LineTo(255,255-outputmax);
meiwunti=true;
}
}
4.圖片看起來怪怪的
因為算出來有可能會overflow所以要加判斷
程式碼:
for(int i=0;i<255;i++)
{
newcolor[i] = outputmin+(i-inputmin)*(((float)outputmax-outputmin)
{
newcolor[i] = outputmin+(i-inputmin)*(((float)outputmax-outputmin)
/(inputmax-inputmin))+0.5;
if(newcolor[i]<0)newcolor[i]=0;
if(newcolor[i]>255)newcolor[i]=255;
}
if(newcolor[i]<0)newcolor[i]=0;
if(newcolor[i]>255)newcolor[i]=255;
}
成果:
圖片4.成果
Curve:利用曲線修改圖辨的顏色。
會遇到的問題:
1. 按Image不能啟動事件
解決方法:enable改成true
另外我得事件是用: OnMouseDown
圖片5.解決不能啟動事件
2.曲線畫出來怪怪的
因為左下角是(0,255) 所以Y=255-Y
程式碼:
Y=255-Y;float a=(float)(Y-X)/(X*X-255*X);
float b=1-255*a;
for(int i=0;i<255;i++)
{//有可能會overflow
newcolor[i]=a*i*i+b*i+0.5;
if(newcolor[i]<0)newcolor[i]=0;
if(newcolor[i]>255)newcolor[i]=255;
}
Image9->Canvas->MoveTo(0,255);
for(int i=1;i<255;i++)
{//畫曲線的部分就是一小段一小段畫就好
Image9->Canvas->LineTo(i,255-newcolor[i]);
}
成果
圖片6.成果
程式碼:點我
2015年10月29日 星期四
資工三乙 02360386 柯明男 HW2
作業內容:直方圖均化
float 綠色基準點 = 128/float(紅色最大值);
float 藍色基準點 = 128/float(紅色最大值);
for(int i=0; i<256; i++)
{
//畫布大小為(128,128)
//此處0.5 為 128/256
Image5->Canvas->MoveTo(0.5*float(i),128);
Image5->Canvas->LineTo (0.5*float(i),128-紅色基準點*紅色直方圖[i]);
Image6->Canvas->MoveTo(0.5*float(i),128);
Image6->Canvas->LineTo (0.5*float(i),128-綠色基準點*綠色直方圖[i]);
Image7->Canvas->MoveTo(0.5*float(i),128);
Image7->Canvas->LineTo (0.5*float(i),128-藍色基準點*藍色直方圖[i]);
}
TImage *tempImage = new TImage(this);
String ComboText=ComboBox1->Text;
if (ComboText == "Image1" && Image2->Picture!=NULL)
tempImage->Picture = Image2->Picture;
else if(ComboText == "Image2" && Image4->Picture!=NULL)
tempImage->Picture = Image4->Picture;
但是這裡會遇到一個問題 在compile的時候會出現
[Linker Error] Unresolved external '__fastcall Extctrls::TImage::TImage(Classes::TComponent *)' referenced from
並且停在TImage宣告的地方
上網查資料料之後發現,老師的Bloger裡面有解答: 點我
解決辦法:
Project > Options > Packages >Runtime Packages中的
Build with Runtime Packages 的勾勾去掉 即可
影像直方圖:影像分成RGB,並且統計0~255 的數量
作法:
(畫布高度) / (統計出的最大值) * (0~255的統計數量) 就是0~255 要畫出來的長度了。程式碼:
float 紅色基準點 = 128/float(紅色最大值);float 綠色基準點 = 128/float(紅色最大值);
float 藍色基準點 = 128/float(紅色最大值);
for(int i=0; i<256; i++)
{
//畫布大小為(128,128)
//此處0.5 為 128/256
Image5->Canvas->MoveTo(0.5*float(i),128);
Image5->Canvas->LineTo (0.5*float(i),128-紅色基準點*紅色直方圖[i]);
Image6->Canvas->MoveTo(0.5*float(i),128);
Image6->Canvas->LineTo (0.5*float(i),128-綠色基準點*綠色直方圖[i]);
Image7->Canvas->MoveTo(0.5*float(i),128);
Image7->Canvas->LineTo (0.5*float(i),128-藍色基準點*藍色直方圖[i]);
}
圖片1.影像直方圖
直方圖均化:講影像色彩平均化拉開,進行對比度調整
作法:
將統計出來的直方圖作cdf轉成累積直方圖,再將 255 * (目前累積的量) / (累積的最大值)
及為新的色彩值了。
程式碼:
for(int i=1;i<256;i++)
{
{
//在這邊第255個值極為最大值
新的紅色色彩值[i] = int(255*(float(累積紅色值[i])/累積紅色值[255]));
新的綠色色彩值[i] = int(255*(float(累積綠色值[i])/累積綠色值[255]));
新的藍色色彩值[i] = int(255*(float(累積藍色值[i])/累積藍色值[255]));
}
for(int j=0; j<iImageHeight; j++)
{
BYTE *bPtrImageRow = (Byte *)Image4->Picture->Bitmap->ScanLine[j];
for(int i=0; i<iImageWidth; i++)
{
bPtrImageRow[3*i+0]=新的藍色色彩值[bPtrImageRow[3*i+0]];
bPtrImageRow[3*i+1]=新的綠色色彩值[bPtrImageRow[3*i+1]];
bPtrImageRow[3*i+2]=新的紅色色彩值[bPtrImageRow[3*i+2]];
}
}
新的紅色色彩值[i] = int(255*(float(累積紅色值[i])/累積紅色值[255]));
新的綠色色彩值[i] = int(255*(float(累積綠色值[i])/累積綠色值[255]));
新的藍色色彩值[i] = int(255*(float(累積藍色值[i])/累積藍色值[255]));
}
for(int j=0; j<iImageHeight; j++)
{
BYTE *bPtrImageRow = (Byte *)Image4->Picture->Bitmap->ScanLine[j];
for(int i=0; i<iImageWidth; i++)
{
bPtrImageRow[3*i+0]=新的藍色色彩值[bPtrImageRow[3*i+0]];
bPtrImageRow[3*i+1]=新的綠色色彩值[bPtrImageRow[3*i+1]];
bPtrImageRow[3*i+2]=新的紅色色彩值[bPtrImageRow[3*i+2]];
}
}
圖片2.直方圖均化
圖片3.處理後的直方圖
延伸問題:
ComboBox:
為了讓我可以隨時切換要看哪一個直方圖
所以我新增了一個 ComboBox 來做選單
而選單中的資料可以用 ComboBox1->Items->Add() 來新增
或者是在介面設計的地方 他的屬性裡面的Item也可以新增
圖片4.ComboBox新增List
程式碼及TImage宣告的的問題:
程式碼只要判斷ComboBox1->Text就可以只到使用者要看哪個圖的直方圖TImage *tempImage = new TImage(this);
String ComboText=ComboBox1->Text;
if (ComboText == "Image1" && Image2->Picture!=NULL)
tempImage->Picture = Image2->Picture;
else if(ComboText == "Image2" && Image4->Picture!=NULL)
tempImage->Picture = Image4->Picture;
但是這裡會遇到一個問題 在compile的時候會出現
[Linker Error] Unresolved external '__fastcall Extctrls::TImage::TImage(Classes::TComponent *)' referenced from
並且停在TImage宣告的地方
上網查資料料之後發現,老師的Bloger裡面有解答: 點我
解決辦法:
Project > Options > Packages >Runtime Packages中的
Build with Runtime Packages 的勾勾去掉 即可
圖片5.解決TImage宣告問題
畫布得刷新:
因為不斷的重新畫直方圖但是3個畫布不會自動清空。
解決辦法:
1. mage5->Canvas->Brush->Color= clWhite;
Image5->Canvas->Rectangle(TRect(0, 0,128, 128));
Image5->Canvas->Rectangle(
此方法就是在畫布上面放一個白色的矩形
不過會因為pen的顏色的關係 會有個邊框在
結果辦法就是設定成 TRect(-1,-1,129,129)即可
2. Image5->Picture=NULL;
不過此方法會把一些基本的設定改掉 需要每次都重新設定畫筆大小及顏色
防呆設定:
防止使用者沒有載入圖片 新增了 bool bLoad; 當有載入就改成true
這樣只要判斷if (bLoad) 即可知道有沒有載入了
如果沒有載入則用 Application->MessageBox("圖片未載入","錯誤",0);
來提醒使用者 還沒有載入圖片。
MessageBox 相關指令網址: 點我
有沒有先做過直方圖再做均化 也可以用if來判斷。
程式碼:點我
2015年10月14日 星期三
資工三乙 02360386 柯明男 HW1
今天介紹的影像處理APP是 Google Camera。
網址:請點我
官方介紹:
精心設計的 Google 相機反應靈敏、操作容易,因此您絕不會錯過任何精彩時刻。Google 相機利用智慧型手機的強大效能,提供 HDR+、鏡頭模糊、廣角、全景以及 Photo Sphere 全景拍攝功能,攝影效果令人驚豔。功能
• 容易操作的介面 - Google 相機的質感設計介面美觀又直覺,拍照錄影毫不費力• 鏡頭模糊 - 使用鏡頭模糊功能控制相機景深,將焦點放在前景的拍攝目標,讓背景變模糊;適用於人像攝影或自拍
• HDR+ - 在亮度偏低和背光場景拍照時,使用 HDR+ (高動態範圍 + 低光拍攝) 設定可有效改善相片品質 (只適用於 Nexus 5 和 Nexus 6)
• 影像拼接 - 使用 Google 為 Google 地圖開發的影像拼接技術拍攝精彩的 Photo Sphere 360º 全景相片,以及全景、廣角和魚眼模式相片
• 錄影 - 只要在錄影時輕按畫面,即可同時擷取靜態影像
• Android Wear - 輕按 Android Wear 裝置即可從遠處操控拍攝相片
系統需求
• 適用於搭載 Android 4.4 (KitKat) 以上版本的手機和平板電腦
• Photo Sphere 全景相片和全景拍攝模式需要使用陀螺儀
• Photo Sphere 全景相片、全景和鏡頭模糊拍攝模式至少需要 1 GB 的記憶體
個人使用心得:
功能1 - 全景攝影:
有別於一般全景攝影是用拖拉的方式來拍攝,他是用手機的陀螺儀來抓水平的點,並標示出藍色點,只要將螢幕上面的點移到手機上的圓圈就會自動拍攝,再用影像接合照片一張一張合起來。優點:
1.不用像是內建的全景拍攝只能向右移動,能夠左右隨機移動。缺點:
1.和一般的比起來處理時間較長。2.如果沒有很好的固定失誤率會比較高。
影片:
影片1.全景拍攝
圖片:
圖片1.不同的模式選擇
圖片2.全景影像攝影
功能2 - 鏡頭模糊:
一般鏡頭模糊是將照片拍攝完畢,再讓使用者選擇要清楚的部分,將其餘部分模糊化,而此APP是將影像拍下來再往上移動,完成拍攝。優點:
1.較不一樣的拍攝方式。缺點:
1.雖然可以自訂哪個部分要模糊化,但清楚的部分都是一大片,不能自訂要說要哪個部分。影片:
影片2.鏡頭模糊
圖片:
圖片3.鏡頭模糊1
圖片4.鏡頭模糊2
功能3 - Photo Sphere 球形全景拍攝
是將全景影像拍攝的功能再強大化,到可以把的整個空見的畫面都拍下來,也是用影像接合合成製作,這個技術需要不斷的微調不然很容易產生破綻。優點:
1.較特別的新功能,也是近幾年滿新潮的功能。2.他觀看圖片的方式不只有平面,還能改成3D的方式看可以用手去滑動或者是手機陀螺儀的移動就像是自己真的在那個地方。
缺點:
1.拍攝難度頗高,很容易拍出失敗的照片來。2.非常的耗時。
影片:
影片3.失真率較高的球形全景攝影
影片4.失真率較低的球形全景攝影+觀看模式
圖片:
圖片5.球形全景拍攝1
圖片6.球形全景拍攝2
圖片7.球形全景拍攝3
其他影片支援:
在Youtube上面搜尋 360VR 可以看到很多近幾年全景影像接合的影片。能拍出破綻這麼少的影片真的算是滿不容易的!!
訂閱:
文章 (Atom)