# 機器視覺 ## Image Acquisition ### 感光元件: * CCD * CMOS ### 色彩與濾色鏡: ![](https://i.imgur.com/RqN5WEb.png =500x) ### 拜爾濾色鏡: ![](https://i.imgur.com/EIdQ1kW.png =300x) ![](https://i.imgur.com/lM51tU9.png =500x) Bayer demosaicing:對濾色後不完整的RGB取樣中,經由内插(CFA)重建出全彩圖 但成果可能造成混疊(aliasing) ### 失真 * Geometric distortion:Barrel distortion(廣角鏡)、Pincushion distortion ![](https://i.imgur.com/IoERNBf.png) * Scattering(散射):如水下影像的光線、色彩散射 * Refraction(折射):光線進不同介質的彎曲 * Blooming:高光溢出、過曝,CCD接受的光子產生過多的電荷向外擴散,解法是減少入光量(遮光罩、減光鏡) * CCD variations:製造瑕疵,讓每個CCD對光的敏感程度不同 * Clipping or wrap-around(剪裁):格式轉換的問題,較高與較低的數值被門檻截斷。 * Chromatic distortion(色度):不同頻率的光線在透鏡中偏折幅度不同,導致不同顏色的光線在偵測器上的位置有差異。 * Quantization effects(量化):解析度/分辨率(1024x1024, 256x256)、色彩深度(8 bits, 10 bits, 12 bits) ### QUANTIZATION AND SPATIAL MEASUREMENT * Nominal resolution:解析能力 * 10 inch square / 500x500 digital image = resolution 0.02 inches. * Field of view (FOV):視野、可視角 * Subpixel resolution:比硬體解析度跟小的單位,像是圓形的邊緣會被近似化 ![](https://i.imgur.com/zhhBYD8.png =500x) Nyquistsampling theorem ![](https://i.imgur.com/OBOsNu6.png =500x) 摩爾紋:不正確的採樣或是影像跟感光元件的空間頻率相近所造成的偽影。我們能改變取樣的大小,或是移動拍攝視角去改變真實物體在感光元件中的採樣位置,由於在影像中這些可能造成摩爾紋的線條間距不同了,進而改變空間頻率,就能減少摩爾紋的發生。 ## IMAGES AND IMAGING OPERATIONS * GRAY-LEVEL MAPPING:改變不同強度pixel的dynamic range(Mapping function),能得到不同效果的灰階圖,比如黑的更黑,白的更白,能提高對比度,或是相反過來。 ![](https://i.imgur.com/I13UGPx.png =300x) * HISTOGRAM EQUALIZATION(直方圖等化):強化影像,能看到細節,比如看清楚陰影下、高光下的場景。 ![](https://i.imgur.com/w0JysNx.png =300x) ### <font color=red>**CONVOLUTION/CORRELATION**</font> ![](https://i.imgur.com/29Jirgs.png =500x) ![](https://i.imgur.com/Fi9zwca.png =500x) ![](https://i.imgur.com/ERtdjCF.png) ![](https://i.imgur.com/VK0SeQ9.png) ### IMAGE PROCESSING IN SPATIAL FREQUENCY DOMAINS 透過DFT能夠還原影像:去高頻底噪、增加細節、壓縮影像、去掉週期性的紋路、去模糊 圖片→DFT→改變DFT圖→IDFT→新圖片 * 去模糊(Wiener Filter) ![](https://i.imgur.com/x4gXFyg.png) ### MULTIRESOLUTIONIMAGE PROCESSING:將圖分為多通道處理 * Gaussian pyramid * Laplacian pyramid ![](https://i.imgur.com/e7imOLM.png =400x) * Wavelet representation (Discrete Wavelet Transform) ![](https://i.imgur.com/qmrJtiD.png =400x) ### [FEATURE PYRAMID NETWORKS](https://ivan-eng-murmur.medium.com/%E7%89%A9%E4%BB%B6%E5%81%B5%E6%B8%AC-s8-feature-pyramid-networks-%E7%B0%A1%E4%BB%8B-99b676245b25) ![](https://i.imgur.com/HuuN5Na.png =500x) * ( a ) 早期作法,對金字塔中的每張特徵圖,都做標記與預測,慢(多做很多重複動作) * ( b ) 只在最後一張feature map做預測 * ( c ) 將CNN進行卷積和降維過程中所產出的不同尺度的feature map用來做預測 * <font color=red>( d ) FEATURE PYRAMID NETWORKS</font>:結合Top-dowm和skip-connection 較高層級的feature map會回頭, upsampling後和低一個層級的feature map做相加,獲得新的 feature map 且在不同尺度的feature maps下都進行預測(下圖b) ![](https://i.imgur.com/AlXDzkS.png =500x) ![](https://i.imgur.com/8TpOrc3.png) ### DEEP LEARNING ![](https://i.imgur.com/1j8i6Vy.png) ## CAMERA MODELS AND CALIBRATION ![](https://i.imgur.com/g61hD0r.png =500x) ### HOMOGENEOUS COORDINATE SYSTEM:利用S,增加一個數值為1的維度 ![](https://i.imgur.com/GiUI3iZ.png =500x) ### PLANAR HOMOGRAPHY:從一個平面映射到另一個平面 ![](https://i.imgur.com/PhMqrQa.png =500x) ### ESTIMATION OF PLANAR HOMOGRAPHY * 一個點對(x,y)有兩個方程 * 四個點對(x,y)能完成HOMOGRAPHY,所以以下src,dst都各是四個點對 ![](https://i.imgur.com/0V4uQRF.png) 得到H映射矩陣後,使用矩陣映射到dst目標位置 也可以用 ``` python # use cv2.getPerspectiveTransform() to get M, the transform matrix, and Minv, the inverse M = cv2.getPerspectiveTransform(src, dst) # use cv2.warpPerspective() to warp your image to a top-down view warped = cv2.warpPerspective(img, M, (dstW, dstH), flags=cv2.INTER_LINEAR) ``` ### CAMERA CALIBRATION I: 得到 CAMERA MATRIX 相機模型 如果要找到內部矩陣: N:corner points數量 K:幾張圖像 ![](https://i.imgur.com/GHkhk9E.png) 如果是一面棋盤,有四個角 N=4 那麼 K≥2 ,至少需要兩個視角的照片 ### 鏡頭校正 相機鏡頭對圖像的影響,會使圖像產生扭曲。 分為徑向畸變和切向畸變。徑向畸變是由於相機鏡頭形狀引起的,而切向畸變則是由於相機組件不對稱引起的。 ![](https://i.imgur.com/0oy72UY.png =500x) ### CAMERA CALIBRATION II: INTRINSIC MATRIX AND DISTORTION PARAMETERS ### 得到內部矩陣與參數:利用棋盤上的特徵 calibrate Camera() ![](https://i.imgur.com/ONcAP8n.png =500x) ### 接著完成校正 calibrate Camera()得到參數與矩陣後 使用initUndistortRectifyMap()和remap() ![](https://i.imgur.com/qUc332u.png =500x) ### 座標系統變換 ![](https://i.imgur.com/CVNM8qt.png =500x) * WORLD COORDINATE SYSTEM TO IMAGE COORDINATE SYSTEM ![](https://i.imgur.com/YpC1IIf.png =500x) * IMAGE COORDINATE SYSTEM TO CAMERA HOMOGENEOUS COORDINATE SYSTEM ![](https://i.imgur.com/BHkK62D.png =500x) ### gpt總結 * 相機模型和校正的過程和順序通常如下: 1. 內部參數標定:使用特殊的校正板拍攝多張圖像,計算相機的內部參數,例如相機的光心位置和焦距等 2. 外部參數標定:使用已知位置和方向的物體拍攝圖像,計算相機在三維坐標系中的位置和方向。 3. 相機校正: a. 鏡頭畸變校正:消除径向畸变和切向畸变等畸變影響。 b. 坐标系转换:将相机坐标系中的三维点投影到图像平面上形成的二维点转换为世界坐标。 注意,相機標定和相機校正是兩個獨立的過程,但是必須先進行相機標定,才能進行相機校正。相機校正的目的是糾正標定過程中產生的誤差,使相機模型更加準確。在進行計算機視覺任務之前,需要對相機進行模型建立和校正,以確保計算的準確性。 ## COLOR 人眼能看到 400~700nm 波長的光線 * RGB (0~255):加色模式 * rgb (0~1):減色模式 經過正規化 ![](https://i.imgur.com/R3DabWh.png) * CMY:減色模式,RGB的補色,代表青色、品紅色和黃色的組合 RGB -> CMY (255-r,255-g,255-b) * HIS:色調(Hue)、亮度 (Saturation)和強度(Intensity) 包含色彩和亮度: 色調表示色彩的基本屬性,飽和度表示色彩的純度和深度,亮度表示色彩的明暗程度。 問題:當飽和度接近於零時,色調的計算和解釋是不可靠的, 當強度低時,飽和度的解釋也是不可靠的。 RGB -> HSI ``` python # 可以直接運行 import numpy as np def RGB_to_HSI(R,G,B): I = max([R,G,B]) min_v= min([R,G,B]) if I >= 0: S = (I-min_v)/I else: S = 0.0 if S <= 0: H = -1.0 return H,S,I diff = I-min_v if R == I: H = np.pi/3*(G-B)/diff elif G==I: H = 2*np.pi/3+np.pi/3*(B-R)/diff elif B==I: H = 4*np.pi/3+np.pi/3*(R-G)/diff if H < 0: H = H + 2*np.pi return H,S,I R,G,B = 192,192,192 H,S,I = RGB_to_HSI(R,G,B) print(H,S,I) ``` * YIQ:NTSC television standard Y 表示亮度 (Luminance),I 和 Q 表示色度 (Chrominance)。色度表示色彩的強度和色調,亮度表示亮度的強度。在 YIQ 模型中,亮度信號和色度信號是分開處理的。 ![](https://i.imgur.com/hFXxRrS.png) * YUV YUV encoding is used in compression algorithms such as JPEG and MPEG. ![](https://i.imgur.com/vw4e0HB.png) * Lab COLOR SPACE:算相對色差 ![](https://i.imgur.com/ttm1LZB.png) * 總結 1. 與其他顏色編碼方案相比,YIQ 和 YUV 具有更好的數字圖像和視頻壓縮潛力 因為它們可以以不同位數調整亮度色度 2. Lab 能反映視覺上的差異 ## BASIC IMAGE FILTERING OPERATIONS ### GAUSSIAN FILTERS * 平滑 降躁 3X3 5X5 ![](https://i.imgur.com/47ZADVX.png) ![](https://i.imgur.com/ygmVSE6.png) ![](https://i.imgur.com/SIw13yh.png) * Sigma越大,下降幅度越平滑 模糊 ![](https://i.imgur.com/UHhQy3A.png) ![](https://i.imgur.com/U83Hq25.png =300x)![](https://i.imgur.com/JoZoqSr.png =300x) ### BOX FILTERS 均值濾波器 ![](https://i.imgur.com/AK8Eypz.png) 降躁 去除<font color=red>均勻環境的躁點(高斯雜訊)</font> 但會變得<font color=red>模糊</font> ![](https://i.imgur.com/N6RnvUF.png) ### REDUCING COMPUTATION LOAD 減少計算量 用<font color=red>降維</font>減少計算量 將二維卷積核 降為 兩個一維卷積核 分別做X,Y方向 ![](https://i.imgur.com/gUZ0rMo.png) ![](https://i.imgur.com/djsTtqq.png) ### MEDIAN FILTERS 中值濾波器(找附近的中值取代) 去除<font color=red>脈衝雜訊(如鹽與胡椒雜訊)</font> ![](https://i.imgur.com/1JqEn76.png) ### MODE FILTERS ![](https://i.imgur.com/TwFH8cm.png) 其中順序只有 順序1:mode->median->mean 順序2:mean->median->mode ### TRUNCATED MEDIAN FILTERS <font color=red>銳化邊緣 脈衝雜訊(如鹽與胡椒)抑制</font> ![](https://i.imgur.com/RflJ21Y.png) ### BILATERAL FILTER 非線性、<font color=red>保持邊緣和降躁</font> 平滑濾波器 採用加權平均的方法,用周邊像素亮度值的加權平均代表某個像素的強度,所用的加權平均基於高斯分佈。最重要的是,雙邊濾波的權重不僅考慮了像素的歐氏距離(如普通的高斯低通濾波,只考慮了位置對中心像素的影響),還考慮了像素範圍域中的輻射差異(例如卷積核中像素與中心像素之間相似程度、顏色強度,深度距離等) ![](https://i.imgur.com/E5QIcC2.png) ### SHARP-UNSHARP MASKING ![](https://i.imgur.com/eiivnCz.png) ![](https://i.imgur.com/2mfbQnW.png) K越大,銳化 Sigma越大,下降幅度越平滑 模糊 ## Thresholding Techniques 最好的閥值是山谷 ![](https://i.imgur.com/h1AAbG0.png =300x) 怎麼生出有山峰跟山谷的直方圖:Laplacian filter ### 如何找到峰谷:OSTU’SMETHOD (自動門檻值決定法則) ![](https://i.imgur.com/nbelc00.png) $p_0$:灰階值低於目標T所佔的比例 $p_1$:灰階值高於目標T所佔的比例 $u_0$:灰階值低於目標T的平均灰階值 $u_1$:灰階值高於目標T的平均灰階值 ![](https://i.imgur.com/dFuHUDP.png) ![](https://i.imgur.com/RjLvlWP.png) 但<font color=red>光照不均勻</font>的情況下,會出問題。 ![](https://i.imgur.com/e1QBMAm.png =300x) ### ADAPTIVE THRESHOLDING METHODS (光照不均勻的解法 自適應算法) 作法是:計算圖像的局部閾值 怎麼算:用鄰近的區塊去算出那個區域的平均值(分為高斯平均與算術平均) ![](https://i.imgur.com/41kSf1J.png) ``` python cv2.adaptiveThreshold(image, 255, 自適應二值化算法, 閥值類型, 參考局部大小, 偏移量) ``` 但反白後的圖會出問題:主要是黑白像素的數量過於相近,導致閥值無法有效分辨。 ![](https://i.imgur.com/vwIZgmp.png =300x) ### HARALICK’S REGION GROWING PROCEDURE:一種自適應方法 由起點(通常是左上角)向外BFS擴散,每個目標將其附近特徵相近的區塊塗抹成同一顏色的方法。 ![](https://i.imgur.com/SafVAFt.png) ## Edge Detection 邊緣偵測 * template-matching ( TM ) 模板匹配 -> 12 masks * differential gradient ( DG ) 微分梯度 -> 2 masks: x,y方向 可以使用 convolution masks ### TM * 用以下判斷邊緣方向(找最大) ![](https://i.imgur.com/wjzEdij.png) * mask ![](https://i.imgur.com/MDWH7Hj.png =300x) ### DG * 計算邊緣梯度(梯度大的是邊緣) ![](https://i.imgur.com/bKUA8Op.png) * 估計邊緣方向(梯度方向) ![](https://i.imgur.com/YvJD0ui.png) * mask ![](https://i.imgur.com/srjqbdT.png) ### hysteresis thresholding 滯後閥值 * 目的:線檢出時,由於光照、干擾等因素,會產生不連續的現象。該方法用於連接。 ![](https://i.imgur.com/9a0ILIO.png) * 步驟是: 1. 若某一像素位置的幅值超過高閾值,則該位置被保留。 2. 若某一像素位置的幅值低於低閾值,則該位置被去除。 3. 若某一像素位置的幅值處於高低閾值之間,則該像素僅僅在連接到一個高於高閾值像素時被保留。 ![](https://i.imgur.com/af8Wp7H.png =300x) ![](https://i.imgur.com/kaCkaES.png =300x) ![](https://i.imgur.com/1YuzATh.png) ### CANNY * 目的:邊緣偵測 * 步驟是: 1. Gaussian filtering 2. 計算一階微分(ex: Sobel masks) ![](https://i.imgur.com/gpagrHt.png) 3. Non-maximum Suppression 非極大值抑制 特徵點可能會在一個區域內有很多個,所以經過濾後,僅保留 local maximum ![](https://i.imgur.com/kKOJFez.png) 4. Hysteresis Thresholding ![](https://i.imgur.com/uZjALsU.png) * 過程 ![](https://i.imgur.com/GStzTZ4.png) ### LAPLACIAN OPERATOR * 二階導數 ![](https://i.imgur.com/WXWggOs.png) * 邊緣處有梯度變化,可以判斷一階與二階導數來找出邊於線條 ![](https://i.imgur.com/3H1Mo7Q.png) ### LOG OPERATION 用Marr-Hildreth operator(LoG) 得到 Laplacianof the Gaussian-smoothed image * Laplacian + Gaussian-smoothed image * 透過找到0來取得邊緣 * 須設定Gaussian-smoothed的kernel width (σ) * σ大,找寬的東西 / σ小,找小細節 ![](https://i.imgur.com/0zOtMCm.png =300x) ![](https://i.imgur.com/VGniAb6.png =300x) ![](https://i.imgur.com/akSrOcK.png =300x) * 人眼錯覺 ![](https://i.imgur.com/NVH5vFG.png) ### ACTIVE CONTOURS ![](https://i.imgur.com/SyRTemu.png) * 向內或向外框住邊緣 ![](https://i.imgur.com/A4x4LSo.png =500x) ![](https://i.imgur.com/7dGSPZp.jpg =500x) ## Corner and Interest Point Detection ### SECOND-ORDER DERIVATIVE SCHEMES * 找出角落的點 * 運用泰勒展開式 ![](https://i.imgur.com/izqP1hv.png) ![](https://i.imgur.com/FwPgXKN.png) ### A MEDIAN FILTER-BASED CORNER DETECTOR 中值濾波 ![](https://i.imgur.com/ILk7HWE.png) ![](https://i.imgur.com/LfJlzVa.png) ### THE HARRIS INTEREST POINT OPERATOR * 因為角點必有兩條邊相連接,透過滑動窗口去找出變化信號值最大的時候,便是角點 * HARRIS具有旋轉和平移的不變性 ![](https://i.imgur.com/XMv12IV.png) ![](https://i.imgur.com/NAXMibV.png) ![](https://i.imgur.com/gjPXTw8.png) ### THE HARRIS-LAPLACIAN DETECTOR * 雖然 HARRIS 具有旋轉和平移的不變性 * 但要解決 scaling 的問題:運用LoG 先透過HARRIS找出興趣點,以LoG在各尺度找到極值 ![](https://i.imgur.com/AMS37Of.png) https://hackmd.io/@tana0101/answer/edit