頭條面經(同學一)

一面


1. 圖像降噪算法

濾波類:比較傳統的一類算法,通過設計濾波器對圖像進行處理,特點是速度往往比較快,很多卷積濾波可以藉助快速傅立葉變化。(重點回答,主要考察濾波類濾波類包括均值濾波,高斯濾波,統計中值濾波,雙邊濾波,引導濾波,NLM(Non-Local means)算法,參考我的博客:https://blog.csdn.net/Victory_tc/article/details/97314568

稀疏表達類:自然圖像不同於隨機噪聲/人造的噪聲,在於其總會在某一個模型(判別式模型)下存在稀疏表達,而躁聲往往不存在這種稀疏表達。

外部先驗證(包括深度學習的方法):如果含有噪聲的圖片本身沒有什麼規律,我們可以藉助其它類似但是沒有噪聲的圖片總結圖片固有的屬性。最具有代表的是混合高斯模型,最火的是深度學習的方法(通過大量的數據學習得到一個高度複雜的圖片約束器

聚類低秩性:稀疏性和低秩性都是自然圖像常見特徵,低秩數據直接存在與一個低微子空間,以此約束來區別噪聲。

推薦博客:https://zhuanlan.zhihu.com/p/32502816

2.圖像增強算法

圖像增強主要解決由於圖像的灰度級範圍較小造成的對比度較低的問題,目的就是將輸出圖像的灰度級放大到指定的程度,使得圖像中的細節看起來增加清晰目的是提高圖像的對比度,是圖像更加清晰,豐富圖像細節。對比度增強有幾種常用的方法,如線性變換、分段線性變換、伽馬變換、直方圖正規化、直方圖均衡化、局部自適應直方圖均衡化等。

線性變換,分段線性變換,伽馬變換,直方圖正規化,直方圖均衡化,局部自適應直方圖均衡化的原理以及python代碼參考我的博客:https://blog.csdn.net/Victory_tc/article/details/97361911

其它圖像增強算法:

指數圖像增強的表達爲:S = cR^r,通過合理的選擇c和r可以壓縮灰度範圍,例如c=1.0/255.0, r=2實現。

對數圖像增強是圖像增強的一種常見方法,其公式爲: S = c log(r+1),其中c是常數(以下算法c=255/(log(256)),這樣可以實現整個畫面的亮度增大。

馬賽克算法的原理:利用中心像素來表示鄰域像素。

曝光過度問題處理:對於曝光過度問題,可以通過計算當前圖像的反相(255-image),然後取當前圖像和反相圖像的較小者爲當前像素位置的值。過度曝光原理:圖像翻轉,然後求原圖與反圖的最小值。

基於拉普拉斯算子的圖像增強: 利用拉普拉斯算子進行圖像增強本質是利用圖像的二次微分對圖像進行銳化,在圖像領域中微分是銳化,積分是模糊,利用二次微分對圖像進行銳化即利用鄰域像素提高對比度。與一階微分相比,二階微分的邊緣定位能力更強,銳化效果更好。

拉普拉斯算子(線性算子,(任意階微分算子都是線性的)):

所以拉普拉斯算子爲:

也就是一個點的拉普拉斯的算子計算結果是上下左右的灰度的和減去本身灰度的四倍。可以根據二階微分的不同定義,所有符號相反,也就是上式所有灰度值全加上負號,就是-1,-1,-1,-1,4。但要注意,符號改變,銳化的時候與原圖的加或減應當相對變化。上面是四鄰接的拉普拉斯算子,將這個算子旋轉45°後與原算子相加,就變成八鄰域的算子了,也就是一個像素周圍一圈8個像素的和與中間像素8倍的差,作爲拉普拉斯計算結果。因爲要強調圖像中突變(細節),在平滑灰度的區域無響應,所以模板係數和爲0,也是二階微分必備條件。

拉普拉斯算子是最簡單的各向同性的微分算子,具有旋轉不變性質,特別適用於以突出圖像中的孤立點、孤立線或線端點爲目的的場合。同梯度算子一樣,拉普拉斯算子也會增強圖像中的噪聲,有時用拉普拉斯算子進行邊緣檢測時,可將圖像先進行平滑處理

圖像銳化處理的作用是使灰度反差增強,從而使模糊圖像變得更加清晰,圖像模糊的實質就是圖像受到平均運算或積分運算,因此可以對圖像進行逆運算,如微分運算能夠突出圖像細節,使圖像變得更爲清晰。由於拉普拉斯是一種微分算子,它的應用可增強圖像中灰度突變的區域,減弱灰度的緩慢變化區域;銳化處理可選擇拉普拉斯算子對原圖像進行處理,產生描述灰度突變的圖像再將拉普拉斯圖像與原始圖像疊加而產生銳化圖像

這種簡單的銳化方法既可以產生拉普拉斯銳化處理的效果,同時又能保留背景信息,將原始圖像疊加到拉普拉斯變換的處理結果中去,可以使圖像中的各灰度值得到保留,使灰度突變處的對比度得到增強,最終結果是在保留圖像背景的前提下,突現出圖像中小的細節信息。但其缺點是對圖像中的某些邊緣產生雙重響應。


3. 邊緣檢測算子:Robert prewit sobel 拉普拉斯 canddy

邊緣檢測算法(主要用於特徵的提取,保留圖像的結構屬性)是圖像處理和計算機視覺的基本問題,主要解決數字圖像中亮度明顯變化的點,圖像屬性的顯著變化通常反映了屬性的重要事件和變化包括深度上的不連續、表面方向不連續、物質屬性變化和場景照明變化。邊緣檢測大多數可以劃分爲兩類:基於查找一類(一階導數的最大值或者最小值)和基於零穿越的一類(二階導數的零點);噪聲和邊緣都屬於高頻信號,噪聲給邊緣檢測檢測帶來了困難,而降噪又會使得邊緣模糊;一階的有Roberts Cross算子,Prewitt算子,Sobel算子,Canny算子,Krisch算子,羅盤算子;而二階的還有Marr-Hildreth,在梯度方向的二階導數過零點。

邊緣和物體間的邊界並不等同,邊緣指的是圖像中像素的值有突變的地方,而物體間的邊界指的是現實場景中的存在於物體之間的邊界。有可能有邊緣的地方並非邊界,也有可能邊界的地方並無邊緣,因爲現實世界中的物體是三維的。

在實際的圖像分割中,往往只用到一階和二階導數,雖然,原理上,可以用更高階的導數,但是,因爲噪聲的影響,在純粹二階的導數操作中就會出現對噪聲的敏感現象,三階以上的導數信息往往失去了應用價值

Roberts算子:是一種利用局部差分算子尋找邊緣的算子,2*2算子模板 (關聯(x,y),(x+1,y), (x, y+1), (x+1, y+1))

Roberts

Sobel算子:一階微分算子,利用一個像素的臨近區域來計算像素的梯度,然後根據一定的絕對值進行取捨。

Sobel 算子

Prewitt算子:與Sobel算子類似,算子模版中的值略有不同。

Prewitt算子

log 算子:先對圖像進行高斯變化(圖像的平滑,也就是高斯濾波),後對平滑後的圖像進行拉普拉斯變化(laplace 銳化(圖像增強))

即先對圖象平滑,後拉氏變換求二階微分,等效於把拉氏變化作用於平滑函數,得到1個兼有平滑和二階微分作用的模板,再與原來的圖像進行卷積。用Marr-Hildreth模板與圖像進行卷積的優點在於,模板可以預先算出,實際計算可以只進行卷積。

Log算子的特點:

(1)通過圖象平滑,消除了一切尺度小於σ的圖像強度變化;

(2)若用其它微分法,需要計算不同方向的微分,而拉普拉斯微分無方向性,因此可以節省計算量;

(3)它定位精度高,邊緣連續性好,可以提取對比度較弱的邊緣點。

LOG濾波器也有它的缺點:當邊緣的寬度小於算子寬度時,由於過零點的斜坡融合將會丟失細節。

LOG濾波器可以近似爲兩個指數函數之差,即DOG ( Difference Of twoGaussians functions):

Canny 算子

該算子功能比前面幾種都要好,但是它實現起來較爲麻煩,Canny算子是一個具有濾波,增強,檢測的多階段的優化算子,在進行處理前,Canny算子先利用高斯平滑濾波器來平滑圖像以除去噪聲,Canny分割算法採用一階偏導的有限差分來計算梯度幅值和方向,在處理過程中,Canny算子還將經過一個非極大值抑制的過程,最後Canny算子還採用兩個閾值來連接邊緣

Canny邊緣檢測算法

step1: 用高斯濾波器平滑圖象;

step2: 用一階偏導的有限差分來計算梯度的幅值和方向;

step3: 對梯度幅值進行非極大值抑制

step4: 用雙閾值算法檢測和連接邊緣

Canny 算子詳解:https://www.cnblogs.com/cfantaisie/archive/2011/06/05/2073168.html

python 代碼實現參考博客:https://www.cnblogs.com/wj-1314/p/9800272.html

5. 手寫馬賽克(Masaic)代碼

馬賽克算法的原理:利用中心像素來表示鄰域像素(在圖片中的某一塊區域,打上馬賽克,馬賽克的算法就是在N個小塊兒區域內(比如有很多個10 * 10小塊兒),使用一個隨機的像素值,代替其他像素值.)

python代碼:

import cv2
import numpy as np

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 在height 50 - 100 width 100 - 200 上 打碼
# 在 10 * 10 的方格內,選取一個像素,進行填充
k = 0
for m in range(100, 200):
    for n in range(100,250):
        if m%10 == 0 and n%10 == 0:
            for i in range(10):
                for j in range(10):
                    (b, g, r) = img[m, n]
                    img[i + m, j + n] = (b, g, r)

cv2.imshow('image', img)
cv2.waitKey(0)

毛玻璃算法:毛玻璃是通過在某一個區域內隨機選擇一個像素點,用來代替當前像素點的做法,實現一個類似毛玻璃的效果。

python:

import cv2
import numpy as np
import random

img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

dst = np.zeros([height, width, 3], np.uint8)

mm = 8
for m in range(height - mm):
    for n in range(width - mm):
        index = int(random.random() * 8)
        (b, g, r) = img[m+index, n+index]
        dst[m, n] = (b, g, r)

cv2.imshow('image', dst)
cv2.waitKey(0)


6. 手寫高斯濾波以及優化

參考個人博客:https://blog.csdn.net/Victory_tc/article/details/97314568

7. c++多態:重載和虛函數
8. 虛函數表、虛函數指針大小
9. gcc編譯過程
10.手寫洗牌算法:N張牌等概率出現在每個位置

二面

 

1. C++ 11新特性
2. const作用:const int func(const int& A) const 
3. new/malloc區別

相同點:


4. 虛繼承
5.四種類型轉換
6.智能指針
7.左值右值、move,
8.手寫雙向鏈表隨機插入新元素的類
9.機器學習:Adam、SGD、RMSProp區別

手寫總結
10.1*1卷積的作用

手寫總結
11. 貝葉斯估計與最大似然估計的區別

12.c++初始化列表, export關鍵字

13.C++類的析構函數不用虛函數,對繼承有什麼影響?

 

三面:


1.手寫均值濾波以及優化代碼

已總結
2.ML/DL數據處理相關操作

數據預處理相關操作:去除唯一屬性、處理缺失值、屬性編碼、數據標準化正則化、特徵選擇、主成分分析

去除唯一屬性:唯一屬性通常是一些id屬性,這些屬性並不能刻畫樣本自身的分佈規律;刪除即可。

處理缺失值:直接使用含有缺失值的特徵;刪除含有缺失值的特徵(該方法在包含缺失值的屬性含有大量缺失值而僅僅包含極少量有效值時是有效的);缺失值補全。

常見的缺失值補全方法:均值插補、同類均值插補、建模預測、高維映射、多重插補、極大似然估計、壓縮感知和矩陣補全。

高維映射:將屬性映射到高維空間,採用獨熱碼編碼(one-hot)技術。將包含K個離散取值範圍的屬性值擴展爲K+1個屬性值,若該屬性值缺失,則擴展後的第K+1個屬性值置爲1。

屬性編碼:

(1)特徵二元化

特徵二元化的過程是將數值型的屬性轉換爲布爾值的屬性,設定一個閾值作爲劃分屬性值爲0和1的分隔點。

(2)獨熱編碼(One-HotEncoding)

獨熱編碼採用N位狀態寄存器來對N個可能的取值進行編碼,每個狀態都由獨立的寄存器來表示,並且在任意時刻只有其中一位有效。

獨熱編碼的優點:能夠處理非數值屬性;在一定程度上擴充了特徵;編碼後的屬性是稀疏的,存在大量的零元分量。

數據標準化正則化:數據標準化是將樣本的屬性縮放到某個指定的範圍。

特徵選擇:從給定的特徵集合中選出相關特徵子集的過程稱爲特徵選擇,進行特徵選擇的兩個主要原因是:減輕維數災難問題;降低學習任務的難度。常見的特徵選擇方法分爲三類:過濾式(filter)、包裹式(wrapper)、嵌入式

主成分分析:降維度

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章