We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
可以看到高光源的地方都已經被模糊處理掉了!
def reduce_highlights(img): img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 先轉成灰階處理 ret, thresh = cv2.threshold(img_gray, 200, 255, 0) # 利用 threshold 過濾出高光的部分,目前設定高於 200 即為高光 contours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) img_zero = np.zeros(img.shape, dtype=np.uint8) # print(len(contours)) for contour in contours: x, y, w, h = cv2.boundingRect(contour) img_zero[y:y+h, x:x+w] = 255 mask = img_zero print("Highlight part: ") show_img(mask) # alpha,beta 共同決定高光消除後的模糊程度 # alpha: 亮度的缩放因子,默認是 0.2, 範圍[0, 2], 值越大,亮度越低 # beta: 亮度缩放後加上的参数,默認是 0.4, 範圍[0, 2],值越大,亮度越低 result = cv2.illuminationChange(img, mask, alpha=0.2, beta=0.4) show_img(result) return result
cv2.threshold 最主要的功能是能夠幫助我們將一張圖片做二值化 二值化的意思是圖片只會剩下兩個值,通常是黑(255)與白(0)。
cv2.threshold(img, 閥值, 最大灰度值, 使用的二值化方法)
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 先將圖片轉為灰階 # 將小於閾值的灰度值設為0,其他值設為最大灰度值。>127 =255, <127 =0 ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
我們使用了 cv2.illuminationChange 這個函數,有模糊高光的效果, 在 OpenCV 中似乎是比較冷門的函數 (因為網路上資料超少……), 上面的程式碼也幾乎是我自己寫的……(網路上有C++版本,但沒有python版本)
簡單來說 cv2.illuminationChange 這個函數 cv2.illuminationChange(img, mask, alpha=0.2, beta=0.4)
第一個參數放我們的圖片 第二個參數放遮罩mask (也就是找到強光的地方,下面會再說明怎麼找) 第三個參數 alpha,亮度的缩放因子,默認是 0.2, 範圍[0, 2], 值越大,亮度越低 第四個參數 beta,亮度缩放後加上的参数,默認是 0.4, 範圍[0, 2],值越大,亮度越低
至於我們怎麼找到我們的遮罩(mask)呢? 我們使用了 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 先將原圖轉成了灰階, 然後對灰階圖片使用 cv2.threshold(img_gray, 200, 255, 0), 我們利用了 threshold 過濾出高光的部分,目前設定高於 200 即認定為高光, 然後再使用 cv2.findContours 找出這些我們所要的輪廓。
但 cv2.findContours 找出的輪廓被儲存在 list 中, 我們必須將他讀出來並做圖,因此才有這一段程式碼,
for contour in contours: x, y, w, h = cv2.boundingRect(contour) img_zero[y:y+h, x:x+w] = 255 mask = img_zero
目的就是為了產生遮罩用的圖片,方便我們做 cv2.illuminationChange 這個函數的運算。
contours, hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
尋找一個二值圖像的輪廓。注意黑色表示背景,白色表示物體,即在黑色背景里尋找白色物體的輪廓
參數: image:8位單通道圖像。非零像素值視為1,所以圖像視作二值圖像
mode:輪廓檢索的方式 cv2.RETR_EXTERNAL:只檢索外部輪廓 cv2.RETR_LIST: 檢測所有輪廓且不建立層次結構 cv2.RETR_CCOMP: 檢測所有輪廓,建立兩級層次結構 cv2.RETR_TREE: 檢測所有輪廓,建立完整的層次結構
method:輪廓近似的方法 cv2.CHAIN_APPROX_NONE:存儲所有的輪廓點 cv2.CHAIN_APPROX_SIMPLE:壓縮水平,垂直和對角線段,只留下端點。 例如矩形輪廓可以用4個點編碼。 cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法 offset:(可選參數)輪廓點的偏移量,格式為tuple,如(-10,10)表示輪廓點沿X負方向偏移10個像素點,沿Y正方向偏移10個像素點
返回值 contours:輪廓點。列表格式,每一個元素為一個3維數組(其形狀為(n,1,2),其中n表示輪廓點個數,2表示像素點坐標),表示一個輪廓 hierarchy:輪廓間的層次關系,為三維數組,形狀為(1,n,4),其中n表示輪廓總個數,4指的是用4個數表示各輪廓間的相互關系。第一個數表示同級輪廓的下一個輪廓編號,第二個數表示同級輪廓的上一個輪廓的編號,第三個數表示該輪廓下一級輪廓的編號,第四個數表示該輪廓的上一級輪廓的編號
https://www.wongwonggoods.com/all-posts/python/python_opencv/opencv-threshold/
The text was updated successfully, but these errors were encountered:
No branches or pull requests
可以看到高光源的地方都已經被模糊處理掉了!
cv2.threshold 最主要的功能是能夠幫助我們將一張圖片做二值化
二值化的意思是圖片只會剩下兩個值,通常是黑(255)與白(0)。
我們使用了 cv2.illuminationChange 這個函數,有模糊高光的效果,
在 OpenCV 中似乎是比較冷門的函數 (因為網路上資料超少……),
上面的程式碼也幾乎是我自己寫的……(網路上有C++版本,但沒有python版本)
簡單來說 cv2.illuminationChange 這個函數
cv2.illuminationChange(img, mask, alpha=0.2, beta=0.4)
第一個參數放我們的圖片
第二個參數放遮罩mask (也就是找到強光的地方,下面會再說明怎麼找)
第三個參數 alpha,亮度的缩放因子,默認是 0.2, 範圍[0, 2], 值越大,亮度越低
第四個參數 beta,亮度缩放後加上的参数,默認是 0.4, 範圍[0, 2],值越大,亮度越低
至於我們怎麼找到我們的遮罩(mask)呢?
我們使用了 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 先將原圖轉成了灰階,
然後對灰階圖片使用 cv2.threshold(img_gray, 200, 255, 0),
我們利用了 threshold 過濾出高光的部分,目前設定高於 200 即認定為高光,
然後再使用 cv2.findContours 找出這些我們所要的輪廓。
但 cv2.findContours 找出的輪廓被儲存在 list 中,
我們必須將他讀出來並做圖,因此才有這一段程式碼,
目的就是為了產生遮罩用的圖片,方便我們做 cv2.illuminationChange 這個函數的運算。
尋找一個二值圖像的輪廓。注意黑色表示背景,白色表示物體,即在黑色背景里尋找白色物體的輪廓
參數:
image:8位單通道圖像。非零像素值視為1,所以圖像視作二值圖像
mode:輪廓檢索的方式
cv2.RETR_EXTERNAL:只檢索外部輪廓
cv2.RETR_LIST: 檢測所有輪廓且不建立層次結構
cv2.RETR_CCOMP: 檢測所有輪廓,建立兩級層次結構
cv2.RETR_TREE: 檢測所有輪廓,建立完整的層次結構
method:輪廓近似的方法
cv2.CHAIN_APPROX_NONE:存儲所有的輪廓點
cv2.CHAIN_APPROX_SIMPLE:壓縮水平,垂直和對角線段,只留下端點。 例如矩形輪廓可以用4個點編碼。
cv2.CHAIN_APPROX_TC89_L1,cv2.CHAIN_APPROX_TC89_KCOS:使用Teh-Chini chain近似算法
offset:(可選參數)輪廓點的偏移量,格式為tuple,如(-10,10)表示輪廓點沿X負方向偏移10個像素點,沿Y正方向偏移10個像素點
返回值
contours:輪廓點。列表格式,每一個元素為一個3維數組(其形狀為(n,1,2),其中n表示輪廓點個數,2表示像素點坐標),表示一個輪廓
hierarchy:輪廓間的層次關系,為三維數組,形狀為(1,n,4),其中n表示輪廓總個數,4指的是用4個數表示各輪廓間的相互關系。第一個數表示同級輪廓的下一個輪廓編號,第二個數表示同級輪廓的上一個輪廓的編號,第三個數表示該輪廓下一級輪廓的編號,第四個數表示該輪廓的上一級輪廓的編號
https://www.wongwonggoods.com/all-posts/python/python_opencv/opencv-threshold/
The text was updated successfully, but these errors were encountered: