Python 与红眼检测混淆

Python 与红眼检测混淆,python,opencv,image-processing,hsl,Python,Opencv,Image Processing,Hsl,首先,我没有要求任何人做我的家庭作业。我想就我在理解以下问题时遇到的困难得到解释或澄清 我刚刚完成了我的图像处理测试,但有一个问题由于我的困惑而无法解决 问题是: 使用以下HSL颜色空间公式编写代码,以在RGB颜色空间中检测给定图像中的红眼: 负载率=L/S 眼睛像素=(L>=64)和(S>=100)和(LS\U比率>0.5)和(LS\U比率=64)和(S>=100)和(LS\U比率>0.5)和(LS\U比率

首先,我没有要求任何人做我的家庭作业。我想就我在理解以下问题时遇到的困难得到解释或澄清

我刚刚完成了我的图像处理测试,但有一个问题由于我的困惑而无法解决

问题是:

使用以下HSL颜色空间公式编写代码,以在RGB颜色空间中检测给定图像中的红眼:

负载率=L/S

眼睛像素=(L>=64)和(S>=100)和(LS\U比率>0.5)和(LS\U比率<1.5)和((H=162))

请注意,在上述公式中,H、S和L代表HSL颜色空间中图像的单个像素值,“eye_pixel”的值将根据H、S和L的值(即,它将是红眼颜色像素还是非红眼颜色像素)为真或假。 您的任务是编写代码来检查图像中的所有像素。将结果存储为numpy数组并显示结果图像

我的代码是:

from __future__ import print_function
import numpy as np
import argparse
import cv2

#argument paser
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required = True, help = "Path to the image")
args = vars(ap.parse_args())

#load the image
image = cv2.imread(args["image"])

#Convert image to HLS
hls = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)

#Split HLS Channels
H = hls[:, :, 0]
S = hls[:, :, 1]
L = hls[:, :, 2]
LS_ratio = L / S

#eye_pixel = (L >= 64) and (S >= 100) and (LS_ratio > 0.5) and (LS_ratio < 1.5) and ((H <= 7) or (H >= 162))

#if HSL pixel
#eye pixel either red or not
#show the image
#cv2.imshow("Image", np.hstack([image, red_eye]))


#debug
print("Lightness is: {}".format(L))
print("Saturation is: {}".format(S))
print("Hue is: {}".format(H))
#print("LS ratio: {}", LS_ratio)

cv2.waitKey(0)
from\uuuuu future\uuuuu导入打印功能
将numpy作为np导入
导入argparse
进口cv2
#变元密码
ap=argparse.ArgumentParser()
ap.add_参数(“-i”,“--image”,required=True,help=“图像路径”)
args=vars(ap.parse_args())
#加载图像
image=cv2.imread(args[“image”])
#将图像转换为HLS
hls=cv2.CVT颜色(图像,cv2.COLOR\u BGR2HLS)
#分割HLS通道
H=hls[:,:,0]
S=hls[:,:,1]
L=hls[:,:,2]
负载率=L/S
#眼睛像素=(L>=64)和(S>=100)和(LS\U比率>0.5)和(LS\U比率<1.5)和((H=162))
#中频HSL像素
#眼睛像素是否为红色
#显示图像
#cv2.imshow(“图像”,np.hstack([图像,红眼])
#调试
打印(“亮度为:{}”。格式(L))
打印(“饱和度为:{}”。格式)
打印(“色调为:{}”。格式(H))
#打印(“LS比率:{}”,LS_比率)
cv2.等待键(0)
假设图像为:

我确实对需要做什么感到困惑。如果有人帮我解释应该做什么,我将不胜感激


谢谢。

您所需要做的就是根据整个H、L、S图像实现公式

#Convert image to HLS
hls = cv2.cvtColor(image, cv2.COLOR_BGR2HLS)

#Split HLS Channels
H = hls[:, :, 0]
L = hls[:, :, 1]
S = hls[:, :, 2]
LS_ratio = L/(S + 1e-6)

redeye = ((L>=64) * (S>=100) * np.logical_or(H<=7, H>=162) * (LS_ratio>0.5) * (LS_ratio<1.5)).astype(bool)

谢谢您的回答。非常感谢。我还有一个问题,我应该怎么做才能显示原始图像和只有红眼的图像?你是说只显示“原始图像的红眼部分”?或者你的意思是分别显示原始图像和红眼图像?只需不使用np.hstack,在
image
redeye
上单独使用imshow,就可以实现后者。对于前者,使用最初获得的redeye bool阵列作为遮罩。前者:显示原始图像和仅水平堆叠的红眼图像。我自己试试。我已经试过你的方法了。我只使用了redeye布尔数组。您得到的是红色而不是白色吗?类似于:
redeye_only=image.copy();仅限redeye_[np.where(np.logical_not(redeye_bool_数组))]=255
redeye = cv2.cvtColor(redeye.astype(np.uint8)*255, cv2.COLOR_GRAY2BGR)
cv2.imshow('image-redeye', np.hstack([image, redeye]))