在Python中使用条件的每像素操作,没有慢循环

我正在尝试将 treshold 应用于图像,但不是常规的简单 treshold。


如果它们符合条件,我需要设置为黑色像素,如果不符合条件,请将它们设置为白色。


我可以循环使用像素,但在1080p图像上,它太长了。


我正在使用HSV进行我需要的比较。


下面是条件的(如果它位于循环中,这个例子是我如何使用它):


if abs(input_pixel_color.hue - reference.hue) < 2 and input_pixel_color.saturation >= 0.25 and input_pixel_color.brightness >= 0.42:

    set_to_black

else:

    set_to_white

input_pixel是循环中像素的 HSV 值。


reference是要与之比较的变量。


我想过使用numpy,但我真的不知道如何写这个:/


提前致谢


白衣染霜花
浏览 105回答 1
1回答

慕的地10843

更新现在,您的实际预期处理已经变得更加清晰,OpenCV功能可能会更好地为您服务。喜欢这个:inRange()#!/usr/local/bin/python3&nbsp;import cv2 as cv&nbsp;import numpy as np&nbsp;# Load the image and convert to HLS&nbsp;image = cv.imread("image.jpg")&nbsp;hls&nbsp; &nbsp;= cv.cvtColor(image,cv.COLOR_BGR2HLS)&nbsp;# Define lower and uppper limits for each component&nbsp;lo = np.array([50,0,0])&nbsp;hi = np.array([70,255,255])&nbsp;# Mask image to only select filtered pixels&nbsp;mask = cv.inRange(hls,lo,hi)&nbsp;# Change image to white where we found our colour&nbsp;image[mask>0]=(255,255,255)&nbsp;cv.imwrite("result.png",image)&nbsp;因此,如果我们使用此图像:我们选择 50-70 范围内的色调,并将它们设置为白色:如果你去这里一个颜色转换器,你可以看到“绿色”是Hue=120,但是OpenCV将Hue除以2,这样360度就变成了180,并且仍然适合uint8。因此,我们在代码中的60表示在线颜色转换器中的120。OpenCV用于uint8图像的范围是:色相 0..180亮度 0..255饱和度 0..255正如我之前所说,您应该养成在调试器中查看数据类型,形状和范围的习惯。要查看 、和最大色相、亮度和饱和度,请使用:shapedtypeprint(hls.dtype, hls.shape)&nbsp;print(hls[...,0].max())print(hls[...,1].max())print(hls[...,2].max())原始答案有几种方法可以做到这一点。性能最高的可能是OpenCV函数,StackOverflow上有很多关于此的答案。cv2.inRange()这是一个Numpy的方式。如果您阅读注释并查看打印的值,则可以了解如何将逻辑 AND 与逻辑 OR 等组合在一起,以及如何解决特定通道问题。#!/usr/bin/env python3from random import randint, seed&nbsp;import numpy as np# Generate a repeatable random HSV imagenp.random.seed(42)h, w = 4, 5HSV = np.random.randint(1,100,(h,w,3),dtype=np.uint8)print('Initial HSV\n',HSV)# Create mask of all pixels with acceptable Hue, i.e. H > 50HueOK = HSV[...,0] > 50print('HueOK\n',HueOK)# Create mask of all pixels with acceptable Saturation, i.e. S > 20 AND S < 80SatOK = np.logical_and(HSV[...,1]>20, HSV[...,1]<80)print('SatOK\n',SatOK)# Create mask of all pixels with acceptable value, i.e. V < 20 OR V > 60ValOK = np.logical_or(HSV[...,2]<20, HSV[...,2]>60)print('ValOK\n',ValOK)# Combine maskscombinedMask = HueOK & SatOK & ValOKprint('Combined\n',combinedMask)# Now, if you just want to set the masked pixels to 255HSV[combinedMask] = 255print('Result1\n',HSV)# Or, if you want to set the masked pixels to one value and the others to another valueHSV = np.where(combinedMask,255,0)print('Result2\n',HSV)示例输出Initial HSV&nbsp;[[[93 98 96]&nbsp; [52 62 76]&nbsp; [93&nbsp; 4 99]&nbsp; [15 22 47]&nbsp; [60 72 85]]&nbsp;[[26 72 61]&nbsp; [47 66 26]&nbsp; [21 45 76]&nbsp; [25 87 40]&nbsp; [25 35 83]]&nbsp;[[66 40 87]&nbsp; [24 26 75]&nbsp; [18 95 15]&nbsp; [75 86 18]&nbsp; [88 57 62]]&nbsp;[[94 86 45]&nbsp; [99 26 19]&nbsp; [37 24 63]&nbsp; [69 54&nbsp; 3]&nbsp; [33 33 39]]]HueOK&nbsp;[[ True&nbsp; True&nbsp; True False&nbsp; True]&nbsp;[False False False False False]&nbsp;[ True False False&nbsp; True&nbsp; True]&nbsp;[ True&nbsp; True False&nbsp; True False]]SatOK&nbsp;[[False&nbsp; True False&nbsp; True&nbsp; True]&nbsp;[ True&nbsp; True&nbsp; True False&nbsp; True]&nbsp;[ True&nbsp; True False False&nbsp; True]&nbsp;[False&nbsp; True&nbsp; True&nbsp; True&nbsp; True]]ValOK&nbsp;[[ True&nbsp; True&nbsp; True False&nbsp; True]&nbsp;[ True False&nbsp; True False&nbsp; True]&nbsp;[ True&nbsp; True&nbsp; True&nbsp; True&nbsp; True]&nbsp;[False&nbsp; True&nbsp; True&nbsp; True False]]Combined&nbsp;[[False&nbsp; True False False&nbsp; True]&nbsp;[False False False False False]&nbsp;[ True False False False&nbsp; True]&nbsp;[False&nbsp; True False&nbsp; True False]]Result1&nbsp;[[[ 93&nbsp; 98&nbsp; 96]&nbsp; [255 255 255]&nbsp; [ 93&nbsp; &nbsp;4&nbsp; 99]&nbsp; [ 15&nbsp; 22&nbsp; 47]&nbsp; [255 255 255]]&nbsp;[[ 26&nbsp; 72&nbsp; 61]&nbsp; [ 47&nbsp; 66&nbsp; 26]&nbsp; [ 21&nbsp; 45&nbsp; 76]&nbsp; [ 25&nbsp; 87&nbsp; 40]&nbsp; [ 25&nbsp; 35&nbsp; 83]]&nbsp;[[255 255 255]&nbsp; [ 24&nbsp; 26&nbsp; 75]&nbsp; [ 18&nbsp; 95&nbsp; 15]&nbsp; [ 75&nbsp; 86&nbsp; 18]&nbsp; [255 255 255]]&nbsp;[[ 94&nbsp; 86&nbsp; 45]&nbsp; [255 255 255]&nbsp; [ 37&nbsp; 24&nbsp; 63]&nbsp; [255 255 255]&nbsp; [ 33&nbsp; 33&nbsp; 39]]]Result2&nbsp;[[&nbsp; 0 255&nbsp; &nbsp;0&nbsp; &nbsp;0 255]&nbsp;[&nbsp; 0&nbsp; &nbsp;0&nbsp; &nbsp;0&nbsp; &nbsp;0&nbsp; &nbsp;0]&nbsp;[255&nbsp; &nbsp;0&nbsp; &nbsp;0&nbsp; &nbsp;0 255]&nbsp;[&nbsp; 0 255&nbsp; &nbsp;0 255&nbsp; &nbsp;0]]备注:1) 您还可以使用否定访问蒙版未选择的像素:# All unmasked pixels become 3HSV[~combinedMask] = 32)省略号()只是一个快捷方式,意思是“我没有打扰列出的所有其他维度”,所以与...HSV[...,1]HSV[:,:,1]3)如果您不喜欢为Hue和饱和度写作,则可以拆分通道HSV[...,0]HSV[...,1]H, S, V = cv2.split(HSV)然后,您可以使用 代替 .完成后,如果要将通道重新组合回 3 通道映像,可以执行以下操作:HHSV[...,0]HSV = cv2.merge((H,S,V))或HSV = np.dstack((H,S,V))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python