Вы можете решить эту проблему, дважды нажав floodFill
:
- Первый раз - залейте черные пиксели не совсем белым цветом.
- Второй раз - закрасить пиксели не совсем белого черным цветом.
По-прежнему существует проблема с поиском значений RGB не совсем белого цвета.
Я нашел импровизированное решение для поиска не совсем белого цвета (я не знаю точных правил какой цвет считается фоновым).
Вот пример рабочего кода:
import cv2
import numpy as np
#Image.open("example_of_misaligned_frame.png") # open poor frame
img = cv2.imread("example_of_misaligned_frame.png")
#img_copy = np.asanyarray(img).copy()
img_copy = img.copy()
#Improvised way to find the Off White color (it's working because the Off White has the maximum color components values).
tmp = cv2.dilate(img, np.ones((50,50), np.uint8), iterations=10)
# Color of Off-White pixel
offwhite = tmp[0, 0, :]
# Convert to tuple
offwhite = tuple((int(offwhite[0]), int(offwhite[1]), int(offwhite[2])))
# Fill black pixels with off-white color
cv2.floodFill(img_copy, None, seedPoint=(0,0), newVal=offwhite)
# Fill off-white pixels with black color
cv2.floodFill(img_copy, None, seedPoint=(0,0), newVal=0, loDiff=(2, 2, 2, 2), upDiff=(2, 2, 2, 2))
cv2.imshow("img_copy", img_copy)
cv2.waitKey(0)
cv2.destroyAllWindows()
Результат cv2.dilate
:
Результат первого cv2.floodFill
:
Результат второго cv2.floodFill
: