Python OpenCV действительно ароматный — убрать белый фон с фото

искусственный интеллект

Недавно я помогал другим делать проект классификации изображений.Он сказал мне, что это двухклассная классификация, чтобы определить, есть ли какие-либо недостатки.Я думал, что это легко принять.

Моя идеальная картина выглядит так:

 

Однако реальная картина такова:

 

Это не преувеличение, есть более преувеличенные, доля объектов очень маленькая, а на большом белом фоне какие-то пятна.

Это создало много проблем для классификации, поэтому первый шаг — убрать фон, не нести чушь и перейти непосредственно к коду.

import cv2
import numpy as np
img=cv2.imread( '01.jpg' )
## (1) Convert to gray, and threshold
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(gray)

#Бинаризация, изменить значение пикселя фона со 150 на 255 на 255
th, threshed = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY_INV)
## (2) Morph-op to remove noise
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (11,11))
morphed = cv2.morphologyEx(threshed, cv2.MORPH_CLOSE, kernel)
## (3) Find the max-area contour
cnts = cv2.findContours(morphed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[-2]
cnt = sorted(cnts, key=cv2.contourArea)[-1]
## (4) Crop and save it
x,y,w,h = cv2.boundingRect(cnt)

#Инвертируйте цвет, чтобы убрать влияние фона.
dst = 255-img[y:y+h, x:x+w]
cv2.imwrite( "001.png" , dst)

результат: