我想在大約 1,5K 影像中找到一個區域,這些影像都采用相似的格式。它們都是對人的繪畫或照片影像的掃描。它們都具有相同的色卡。色卡可以放置在影像的任一側(參見下面的示例影像)。
結果應該是一個影像,只包含人的肖像。
我能夠找到與opencv模板匹配的色卡:
import cv2
import numpy as np
method = cv2.TM_SQDIFF_NORMED
# Read the images from the file
img_rgb = cv2.imread('./imgs/test_portrait.jpg')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('./portraet_color_card.png', 0)
w, h = template.shape[::-1]
result = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = .97
loc = np.where(result >= threshold)
for pt in zip(*loc[::-1]):
print("Found:", pt)
cv2.rectangle(img_rgb, pt, (pt[0] w, pt[1] h), (0,255,255), 2)
cv2.imwrite('result.png',img_rgb)
輸出:
Found: (17, 303)
Found: (18, 303)
Found: (17, 304)
Found: (18, 304)
通過坐標和影像尺寸,我能夠確定影像是左還是右,并且可以裁剪影像。結果遠非完美,因為邊界仍然存在。
有沒有更好的方法從影像中提取肖像?我更喜歡使用 python 和 opencv,但我愿意接受其他關于如何為大量影像解決這個問題的建議。
樣品:

模板:

uj5u.com熱心網友回復:
此解決方案假設肖像是影像中最大的圖案

解決步驟按順序:
經典影像處理從影像中獲取重要特征:
- 轉換為灰度級。
- 高斯模糊可減少噪點并平滑影像。
- 邊緣檢測,
Canny在我的例子中使用。 - 形態膨脹將特征分為兩種主要模式。
- 最大連接組件檢測(歸功于舊的
兩個分段的單元格為我們提供了一種非常簡單的驗證方法(比較尺寸、相對位置等)。此時我們可以輕松找到色卡背景(最好在已識別的色細胞附近進行多次測量):

正如您所看到的一些噪音,有損壓縮偽影會影響結果,但它仍然足夠好(另一種驗證可能性:比較單元和卡大小)。此時,我們可以進行額外的測量以找到背景顏色。
讓我們先回顧一下簡單的案例:結果似乎已經足夠好了,所以最終的crop和小的正確性可以很容易地實作:



有些情況不會那么簡單:

我建議在驗證規則上投入更多時間并手動處理所有棘手的案例,但也可以通過一些額外的時間來解決“常見的棘手問題”。
無論如何,這里是一個簡短的總結:
- 使用關鍵顏色可靠地識別色卡(并進行初始驗證)
- 進行多次測量以查找色卡背景(因此您可以使用較小的閾值)
- 進行多次測量以定義影像背景
- 驗證策略是必須的,因此手動處理少量剩余物會更容易

PS:白底白字很有趣,但Kazimir Malevich很久以前就做過了,無需重復 :)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/408486.html標籤:
