opencv祛除高光
代碼是直接借鑒的Opencv去除高光_SkyrimDragonBorn的博客-CSDN博客
原博客是c++,我這邊只是使用python進行翻譯了一下
參考的論文應該是這個:
(1)
?Real-Time Specular Highlight Removal Using Bilateral Filtering | SpringerLinkIn this paper, we propose a simple but effective specular highlight removal method using a single input image. Our method is based on a key observation - the maximum fraction of the diffuse color component (so called maximum diffuse chromaticity in the literature) in...https://link.springer.com/chapter/10.1007/978-3-642-15561-1_7
(2)Efficient and Robust Specular Highlight Removal | IEEE Journals & Magazine | IEEE Xplorehttps://ieeexplore.ieee.org/abstract/document/6915741
import cv2 import numpy as npimg = cv2.imread('xxx.jpg')def highlight_remove(img):img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB).astype(np.float32)#一定要轉換成float32,否則會出錯# img = cv2.resize(img, (512, 512)).astype(np.float32)#如圖片分辨率較大,直接resize到512會比較快dst = img.copy()h, w = img.shape[:2]for i in range(h):for j in range(w):R = img[i, j, 0]G = img[i, j, 1]B = img[i, j, 2]alpha_r = R/(R+G+B)alpha_g = G/(R+G+B)alpha_b = B/(R+G+B)# alpha = max(max(alpha_r, alpha_g), alpha_b)MaxC = max(max(R, G), B)minalpha = min(min(alpha_r, alpha_g), alpha_b)gama_r = (alpha_r - minalpha) / (1 - 3 * minalpha)gama_g = (alpha_g - minalpha) / (1 - 3 * minalpha)gama_b = (alpha_b - minalpha) / (1 - 3 * minalpha)gama = max(max(gama_r, gama_g), gama_b)temp = (gama * (R + G + B) - MaxC) / (3 * gama - 1)dst[i, j, 0] = np.clip(R-(temp+0.5), 0, 255)dst[i, j, 1] = np.clip(G-(temp+0.5), 0, 255)dst[i, j, 2] = np.clip(B-(temp+0.5), 0, 255)return dst[:, :, ::-1]res = highlight_remove(img) res = np.clip(res, 0, 255) cv2.imwrite('xxx_remove.jpg', res)效果如下,基本上可以和原來的c++版對應上?
?不過親測這個算法只適合本來原圖就是偏暗的圖片,我這樣的試了幾張生活照基本上都失敗的,所以這個算法適用范圍很有限。
?
總結
以上是生活随笔為你收集整理的opencv祛除高光的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 根据日期,转换成星座、生肖工具类
- 下一篇: android 刷新activity(