python OpenCV का उपयोग करके लाल रंग क्षेत्रों को कैसे खोजें?




colors (4)

मैं एक कार्यक्रम बनाने की कोशिश कर रहा हूं जहां मैं लाल का पता लगाऊं। हालांकि कभी-कभी यह सामान्य से अधिक गहरा होता है इसलिए मैं केवल एक मूल्य का उपयोग नहीं कर सकता। लाल रंग के विभिन्न रंगों का पता लगाने के लिए एक अच्छी सीमा क्या है? मैं वर्तमान में 128, 0, 0 - 255, 60, 60 की सीमा का उपयोग कर रहा हूं, लेकिन कभी-कभी यह एक लाल वस्तु का भी पता नहीं लगाता है जो मैंने इसके सामने रखा था।


कृपया, RGB के बजाय HSV या HSL (hue, saturation, luminance) का उपयोग करें, HSV में कुछ थ्रेसहोल्ड के भीतर hue के मूल्य का उपयोग करके लाल रंग का आसानी से पता लगाया जा सकता है।


RGB विशिष्ट रंग पहचान के लिए एक अच्छा रंग स्थान नहीं है। HSV एक अच्छा विकल्प होगा।

RED के लिए, आप निम्न (175,50,20)~(180,255,255) का उपयोग करके HSV रेंज (0,50,20) ~ (5,255,255) और (175,50,20)~(180,255,255) चुन सकते हैं। बेशक, RED range उतना सटीक नहीं है, लेकिन यह ठीक है।

मेरे दूसरे उत्तर से लिया गया कोड: पता लगाएँ कि क्या कोई पिक्सेल लाल है या नहीं

#!/usr/bin/python3
# 2018.07.08 10:39:15 CST
# 2018.07.08 11:09:44 CST
import cv2
import numpy as np
## Read and merge
img = cv2.imread("ColorChecker.png")
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

## Gen lower mask (0-5) and upper mask (175-180) of RED
mask1 = cv2.inRange(img_hsv, (0,50,20), (5,255,255))
mask2 = cv2.inRange(img_hsv, (175,50,20), (180,255,255))

## Merge the mask and crop the red regions
mask = cv2.bitwise_or(mask1, mask2 )
croped = cv2.bitwise_and(img, img, mask=mask)

## Display
cv2.imshow("mask", mask)
cv2.imshow("croped", croped)
cv2.waitKey()

संबंधित जवाब:

  1. `cv :: inRange` (OpenCV) के साथ रंग का पता लगाने के लिए सही ऊपरी और निचले HSV सीमाओं का चयन
  2. कैसे एक छवि में केवल हरे रंग की वस्तुओं का पता लगाने के लिए एक दहलीज मूल्य को परिभाषित करें: Opencv
  3. पायथन-ओपनसीवी में `cv2.inRange` का उपयोग करके दो अलग-अलग रंगों का पता कैसे लगाएं?
  4. पता लगाएँ कि क्या कोई पिक्सेल लाल है या नहीं

बेशक, विशिष्ट प्रश्न के लिए, शायद अन्य रंग स्थान भी ठीक है।

कैसे उपयोगिता मीटर सुई opencv के साथ पढ़ने के लिए?


रेड कलर का मतलब है रेड और ब्लू की तुलना में रेड वैल्यू ज्यादा है।

तो आप रेड और ब्लू, रेड और ग्रीन के बीच अंतर की जांच कर सकते हैं।

आप बस आरजीबी को अलग-अलग चैनलों में विभाजित कर सकते हैं और इस तरह सीमा लागू कर सकते हैं।

b,g,r = cv2.split(img_rgb)
rg = r - g
rb = r - b
rg = np.clip(rg, 0, 255)
rb = np.clip(rb, 0, 255)

mask1 = cv2.inRange(rg, 50, 255)
mask2 = cv2.inRange(rb, 50, 255)
mask = cv2.bitwise_and(mask1, mask2)

आशा है कि यह आपकी समस्या का समाधान हो सकता है।

धन्यवाद।


आप देख सकते हैं कि लाल घटक अधिकतम है और अन्य दोनों स्पष्ट रूप से कम हैं:

def red(r, g, b):
    threshold = max(r, g, b)
    return (
        threshold > 8          # stay away from black
        and r == threshold     # red is biggest component
        and g < threshold*0.5  # green is much smaller
        and b < threshold*0.5  # so is b
    )

यह बहुत कुशलता से numpy का उपयोग करके लागू किया जा सकता है।

"सही तरीका" एचएसवी के लिए एक पूर्ण रूपांतरण कर रहा होगा और वहां जांच करेगा, लेकिन यह धीमा और कुछ हद तक पेचीदा होगा (ह्यू एक कोण है, इसलिए आप अंतर के पूर्ण मूल्य को नहीं ले सकते हैं, जैसे रंग (255, 254) , 254) "लाल" के रूप में योग्य होने जा रहे हैं, भले ही उन्हें मानव के लिए सफेद माना जाए)।

ध्यान दें कि मानव दृश्य प्रणाली औसत के लिए क्षतिपूर्ति करती है, इसलिए कुछ को "नीला" के रूप में देखा जा सकता है, भले ही वास्तव में सबसे बड़ा घटक लाल हो, लेकिन छवि में सब कुछ लाल है, ताकि हमारे मस्तिष्क के लिए "गिनती" न हो।

नीचे दी गई छवि में यदि आप किसी मानव से पूछते हैं कि वृत्त क्षेत्र में कौन सा रंग सबसे अधिक "नीला" है, जबकि वास्तव में सबसे बड़ा घटक लाल है:







colors