Python:获得裁剪区域外的平均颜色

Python:获得裁剪区域外的平均颜色,python,numpy,opencv,python-imaging-library,cv2,Python,Numpy,Opencv,Python Imaging Library,Cv2,我有一个图像,其中有一个对象,我用Canny过滤器从图像中裁剪出来 import cv2 import numpy as np from matplotlib import pyplot as plt from PIL import Image # load image img = cv2.imread('dataset/example.png') #. #. #. #. #. # canny edge detection then find the non-zero min-max co

我有一个图像,其中有一个对象,我用Canny过滤器从图像中裁剪出来

import cv2
import numpy as np
from matplotlib import pyplot as plt
from PIL import Image

# load image
img = cv2.imread('dataset/example.png')

#.
#.
#.
#.
#.

# canny edge detection then find the non-zero min-max coords of canny 

#.
#.
#.
#.
#.

# ROI
roi = img[y1:y2, x1:x2]
## crop ROI
cropped = np.array(img)
cropped[y1:y2, x1:x2] = (0, 0, 0)
bg = Image.fromarray(cropped)
这是我得到的结果:


是否有方法选择裁剪区域以外的区域(黑框)?基本上选择裁剪后的[y1:y2,x1:x2]的倒数,然后获得该背景的平均颜色?

您可以使用
cv2。使用遮罩表示:

# create a mask from coordinages
mask = cv2.rectangle(np.zeros(img.shape[:2],'uint8'), (y1,x1), (y2,x2), 255, -1)

# out
means = cv2.mean(img, mask=mask)

不能裁剪非4顶点多边形-请记住,您正在使用矩阵。如果要获得非黑色区域的
轮廓
,可以首先使用
0
的阈值获得二进制掩码。这将以白色呈现高于该值的所有内容。然后得到二元掩模的轮廓,如下所示:

# importing cv2 & numpy
import numpy as np
import cv2

# image path
path = "C://opencvImages//"
fileName = "squareTest.png"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Grayscale conversion:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Fixed Thresholding:
thresholdValue = 0
_, binaryImage = cv2.threshold(grayscaleImage, thresholdValue, 255, cv2.THRESH_BINARY)
means = cv2.mean(inputImage, mask=binaryImage)
这是您获得的掩码:

现在,简单地获取轮廓:

# Find the contours on the mask image:
contours, hierarchy = cv2.findContours(binaryImage, cv2.RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)

# Draw the contours on the mask image:
cv2.drawContours(inputCopy, contours, -1, (255, 0, 0), 3)
结果是:

现在,如果您想要非黑色区域的平均BGR(A)值,请使用我们获得的二进制掩码并将其传递给
cv2。mean
作为
掩码,如下所示:

# importing cv2 & numpy
import numpy as np
import cv2

# image path
path = "C://opencvImages//"
fileName = "squareTest.png"

# Reading an image in default mode:
inputImage = cv2.imread(path + fileName)

# Grayscale conversion:
grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)

# Fixed Thresholding:
thresholdValue = 0
_, binaryImage = cv2.threshold(grayscaleImage, thresholdValue, 255, cv2.THRESH_BINARY)
means = cv2.mean(inputImage, mask=binaryImage)
你会得到:

(130.01283431634118, 223.66963836747732, 121.75817119126356, 0.0)