我无法在 for 循环中返回图像的高度和宽度值,也无法在遮罩中设置颜色



我的第一个问题是我想在我剪切的图像中逐像素地移动并计算颜色值,但我得到以下错误:

AttributeError:"numpy。narray ' object没有属性'width'

我的第二个问题是,当match_masking_color值为255时,例如,该区域变成蓝色,即使我设置阈值并将其转换为二值图像,它仍然是蓝色的。例如,我输入的值是255,255,255,但这次嘴巴的内部是红色的。我想让嘴是黑色的,脸是白色的,我可以数出这两种颜色的数量。以下是我所说的结果:蓝面具1蓝面具2红嘴

import cv2
import numpy as np
img = cv2.imread("saskin.jpg")
black_count = 0
white_count = 0

def region_of_interest(image, vertices):
mask = np.zeros_like(img)
match_mask_color = 255,255,255
cv2.fillPoly(mask, vertices, match_mask_color)
masked_image = cv2.bitwise_and(img, mask)
return masked_image
while True:
# ret, frame = cap.read()
# frame = cv2.flip(frame,1)
# print(frame. Shape)    # 480,640

ycrbc = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)

minYCrCb = np.array([0,140,90],np.uint8)
maxYCrCb = np.array([230,170,120],np.uint8)
imgeYCrCb = cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
skinRegionYCrCb = cv2.inRange(imgeYCrCb,minYCrCb,maxYCrCb)
skinYCrCb = cv2.bitwise_and(img, img, mask = skinRegionYCrCb)
median_ycrcb = cv2.medianBlur(skinYCrCb, 3)

_, esik = cv2.threshold(median_ycrcb, 20, 255, cv2.THRESH_BINARY)
median_binary = cv2.medianBlur(esik, 7)

gray = cv2.cvtColor(median_binary, cv2.COLOR_BGR2GRAY)

contours, hierarchy = cv2.findContours(gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
x,y,w,h = cv2.boundingRect(contours[max_index])

height, width = h, w
region_of_interest_vertices = [(width/4, 11*height/12), (width/4, 13*height/16), (3*width/4, 13*height/16), (3*width/4, 11*height/12)]
gray_image = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cropped_image = region_of_interest(gray_image, np.array([region_of_interest_vertices], np.int32))

_, agiz = cv2.threshold(cropped_image, 20, 255, cv2.THRESH_BINARY)
for x in range(agiz.width):
for y in range(agiz.height):
pixel = img.getpixel((x, y))

if pixel == (0):
black_count += 1

elif pixel == (255):
white_count += 1
cv2.imshow("ycrbc",ycrbc)
cv2.imshow("skinYCrCb",median_ycrcb)
cv2.imshow("binary goruntu", esik)
cv2.imshow("median_binary", median_binary)
cv2.imshow("Kesilmiş Görüntü",cropped_image)
cv2.imshow("agiz", agiz)

if cv2.waitKey(5) & 0xFF == ord("q"):
break

# cap.release()
cv2.destroyAllWindows()

我怎样才能使输出由黑色和白色组成,因为我想要这个蒙版的结果?如何在裁剪图像的像素值内导航?

您似乎混淆了两个不同的软件包,cv2和PIL。widthheightgetpixel属于Image。使用cv2时,PIL的图像实例,其中图像表示为numpy数组。因此,您需要通过agiz.shape访问图像的尺寸:

width = agiz.shape[1] 
height = agiz.shape[0]
# accessing a within your for loop
pixel = agiz[y, x]

关于您的错误消息:在将来发布错误消息的完整回溯会更有帮助,因为它直接说明了错误发生的位置。

最新更新