Я хочу удалить черную часть фона или изменить ее цвет на другой. поскольку я пытаюсь обнаружить темный пиксель внутри контура, и это, похоже, не работает, поскольку оба находятся на черном фоне, а темные пиксели черные...
Это то, что я пробовал, но, пожалуйста, предложите любой другой возможный метод. Заранее спасибо
Я попытался извлечь черный фон и изменить его на желтый
Пожалуйста, найдите мой код ниже:
import cv2
import numpy as np
mask_color= (0.0,0.0,1.0)
#reading the image
img= cv2.imread('notused.jpg')
#convering the image into grayscale
gray_image= cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#applying threshold
ret,thresh= cv2.threshold(gray_image,70,255,cv2.THRESH_BINARY)
#finding contours on the original image
_, contours,hierarchy =cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
#creating a mask as of the image size which is a black image
mask= np.zeros(img.shape[:2],np.uint8)
#inverted to get a white image
maskinv=cv2.bitwise_not(mask)
#drawn contours on the white image
mask_contours=cv2.drawContours(maskinv,contours,0,0,-3)
#converted to 3 channels
mask_stack= np.dstack([mask_contours]*3)
#to get only the background and remove all the contours
img1=cv2.bitwise_xor(img,img,mask)
#changing every pixel of the background image to yellow
for y in range(img1.shape[0]-1): #row values
for x in range(img1.shape[1]-1): #column values
img1[y,x]=(0,255,255)
Затем я воспользовался этим: Как сделать Убрать фон с такого изображения?
Это должно было смешать исходное изображение с созданным фоном, но, похоже, не работает и выдает ошибку.
mask_stack= mask_contours.astype('float32')/255.0
img1=img1.astype('float32')/255.0
masked= (mask_stack *img1)+((1-mask_stack)*mask_color)
masked=(masked*255).astype('uint8')
cv2.waitKey(0)
cv2.destroyAllWindows()
Это сообщение об ошибке: Обратите внимание, что у меня и img1, и маска имеют одинаковую форму
Traceback (последний последний вызов):
Файл "", строка 1, в runfile('C:/Users/User/Anaconda3/darkpixeldetection.py', wdir='C:/Users/User/Anaconda3')
Файл "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", строка 678, в файле запуска execfile (имя файла, пространство имен)
Файл "C:\Users\User\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", строка 106, в execfile exec(compile(f.read(), имя файла, 'exec'), пространство имен)
Файл "C:/Users/User/Anaconda3/darkpixeldetection.py", строка 69, в masked= (mask_stack *img1)+((1-mask_stack)*mask_color)
ValueError: операнды не могли передаваться вместе с формами (1540,2670) (1540,2670,3)
Вывод img1.shape:
(1540,2670,3)
Вывод mask_stack.shape:
(1540,2670,3)
Фред: Это мое входное изображение с размытым содержимым. Это выходное изображение, которое я получаю после удаления ненужных контуров. Это мой код:
import numpy as np
import cv2
img_original= cv2.imread('blueimagewithblur.jpg')
img_array=np.asarray(img_original)
blur= cv2.pyrMeanShiftFiltering(img_original,21,49)
gray_image= cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
ret,thresh= cv2.threshold(gray_image,70,255,cv2.THRESH_BINARY)
_, contours,hierarchy =cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
countourimage=cv2.drawContours(img_original,contours,-1,0,3)
largest_area= 2000
for i,c in enumerate(contours):
contour_areas=cv2.contourArea(c)
if(contour_areas>largest_area):
del contours[i]
x_rect,y_rect,w_rect,h_rect=cv2.boundingRect(c)
cropped=img_original[y_rect:y_rect+h_rect,x_rect:x_rect+w_rect]
cv2.imwrite('C:/Users/User/Anaconda3/stackoverflowexam.jpg',cropped)
cv2.imshow('croopedd',cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()