मेरे पास भूरे रंग की पृष्ठभूमि के विभिन्न रंगों के साथ चेहरे की छवियों का एक सेट है। मुझे सभी छवियों की पृष्ठभूमि को 18% ग्रे में बदलने की आवश्यकता है। [नोट: 18% ग्रे के लिए: rgb(128,128,128) और रंग कोड: #808080]

मैं छवि पृष्ठभूमि के अंतर को 18% ग्रे के साथ मापना और इसे आउटपुट करना चाहता हूं। पूरा वर्कफ़्लो यहां पाया जा सकता है: https://i.imgur.com/jSvqam4.png

मैंने निम्नलिखित कोड की कोशिश की और यह पृष्ठभूमि का रंग बदल रहा है लेकिन क्लीनर तरीके से नहीं।

import cv2
import numpy as np

BLUR = 21
CANNY_THRESH_1 = 10
CANNY_THRESH_2 = 200
MASK_DILATE_ITER = 0
MASK_ERODE_ITER = 10
MASK_COLOR = (128,128,128)


img = cv2.imread('input.JPG')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

edges = cv2.Canny(gray, CANNY_THRESH_1, CANNY_THRESH_2)
cv2.imshow('edges', edges)
edges = cv2.dilate(edges, None)

contour_info = []

contours, _ = cv2.findContours(edges, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)

for c in contours:
    contour_info.append((
        c,
        cv2.isContourConvex(c),
        cv2.contourArea(c),
    ))
contour_info = sorted(contour_info, key=lambda c: c[2], reverse=True)
max_contour = contour_info[0]

mask = np.zeros(edges.shape)
cv2.fillConvexPoly(mask, max_contour[0], (255))

mask = cv2.dilate(mask, None, iterations=MASK_DILATE_ITER)
cv2.imshow('mask', mask)

mask_stack = np.dstack([mask]*3)

mask_stack  = mask_stack.astype('float32') / 255.0         
img         = img.astype('float32') / 255.0                 

masked = (mask_stack * img) + ((1-mask_stack) * MASK_COLOR) 
masked = (masked * 255).astype('uint8')                     

cv2.imshow('img', masked)                            
cv2.waitKey()

cv2.imwrite('output.JPG', masked) 

क्या कोई मेरी इसके साथ मदद कर सकता है?

0
Sara S 6 अप्रैल 2020, 07:11
कृपया नमूना आउटपुट, वांछित और वास्तविक परिणाम प्रदान करें।
 – 
lenik
6 अप्रैल 2020, 08:50

1 उत्तर

वास्तविक नमूनों के बिना उपयुक्त ट्यून करने योग्य पैरामीटर ढूंढना हमेशा असंभव होता है।

मैं इसे केवल एक अतिरिक्त गाइड उत्तर के रूप में जोड़ूंगा, हो सकता है कि आपको गहन शिक्षण मॉडल के साथ अर्थ विभाजन पर विचार करना चाहिए। OpenCV के पास इन कार्यों के लिए पूर्व-प्रशिक्षित कई मॉडल हैं। मैं एक नमूना कोड जोड़ रहा हूं जो आपको एक cv2.dnn नेटवर्क का उपयोग करके सेगमेंट और मास्क प्राप्त करने में मदद करेगा।

import cv2
import time
import numpy as np
# read network weight
net = cv2.dnn.readNet('enet-model.net')

img = cv2.imread('1.jpg')

blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (1024, 512), 0, swapRB=True, crop=False)

import matplotlib.pyplot as plt

plt.imshow(img)
plt.show()

net.setInput(blob)
start = time.time()
output = net.forward()
end = time.time()
human_segmentation = output[0,12,:,:] # 12 as 12 is the class index for human in this net
# you can use this as a mask
plt.imshow(cv2.resize(human_segmentation,(img.shape[1], img.shape[0])))
plt.show()
print(f'time: {end-start}')

ध्यान दें: आप ई-नेट https://github डाउनलोड कर सकते हैं। com/simogasp/opencv-semantic-segmentation/tree/master/enet-cityscapes (मुझे व्यक्तिगत रूप से ई-नेट बहुत मददगार नहीं लगा क्योंकि यह बहुत स्पष्ट रूप से खंडित नहीं था, लेकिन अन्य मॉडल भी हैं)

अन्य cv2 मॉडल: https://github.com/opencv/open_model_zoo/tree/master/ मॉडल

enter image description here

0
furcifer 6 अप्रैल 2020, 09:20