日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python+Opencv颜色和形状检测

發(fā)布時(shí)間:2023/12/15 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python+Opencv颜色和形状检测 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

    • 一、場(chǎng)景需求解讀
    • 二、算法原理簡(jiǎn)介
    • 三、算法實(shí)現(xiàn)步驟
    • 四、算法代碼實(shí)現(xiàn)
    • 五、算法效果展示與分析
    • 參考資料
    • 注意事項(xiàng)

一、場(chǎng)景需求解讀

??現(xiàn)實(shí)場(chǎng)景中,我們有時(shí)需要自動(dòng)的檢測(cè)出圖片中目標(biāo)的顏色和其對(duì)應(yīng)的形狀,然后根據(jù)這些信息快速的找到我們需要的目標(biāo),這在真實(shí)場(chǎng)景中具有廣泛的應(yīng)用。下圖展示了一張實(shí)例,我們需要知道圖片中目標(biāo)的顏色和形狀信息。

二、算法原理簡(jiǎn)介

??為了檢測(cè)不同物體的顏色,本文的實(shí)現(xiàn)思路為:1)首先定義一個(gè)顏色標(biāo)簽類(lèi),該類(lèi)中包含一個(gè)顏色字典,包含了需要的所有顏色;2)然后針對(duì)每一個(gè)輪廓(mask),計(jì)算當(dāng)前l(fā)ab*顏色值與圖像平均值之間的距離;3)最終選擇最小距離所代表的顏色值。
??為了檢測(cè)不同物體的形狀,本文的實(shí)現(xiàn)思路為:1)首先對(duì)輸入圖片執(zhí)行預(yù)處理;2)然后對(duì)預(yù)處理之后的圖片執(zhí)行二值化;3)接著進(jìn)行輪廓檢測(cè),并根據(jù)頂點(diǎn)的個(gè)數(shù)進(jìn)行形狀的判斷。

三、算法實(shí)現(xiàn)步驟

步驟1-讀取輸入圖片;
步驟2-對(duì)輸入圖片執(zhí)行裁剪操作;
步驟3-執(zhí)行高斯模糊操作,進(jìn)行圖像去噪;
步驟4-執(zhí)行圖像灰度化操作;
步驟5-執(zhí)行顏色空間變換,將RGB空間轉(zhuǎn)換為L(zhǎng)AB空間;
步驟6-執(zhí)行二值化操作;
步驟7-遍歷每一個(gè)輪廓,進(jìn)行顏色和形狀檢測(cè);
步驟8-繪制并顯示結(jié)果。

四、算法代碼實(shí)現(xiàn)

1、創(chuàng)建一個(gè)顏色標(biāo)簽類(lèi)

# coding=utf-8 # 導(dǎo)入一些python包 from scipy.spatial import distance as dist from collections import OrderedDict import numpy as np import cv2# 創(chuàng)建一個(gè)顏色標(biāo)簽類(lèi) class ColorLabeler:def __init__(self):# 初始化一個(gè)顏色詞典colors = OrderedDict({"red": (255, 0, 0),"green": (0, 255, 0),"blue": (0, 0, 255)})# 為L(zhǎng)AB圖像分配空間self.lab = np.zeros((len(colors), 1, 3), dtype="uint8")self.colorNames = []# 循環(huán) 遍歷顏色詞典for (i, (name, rgb)) in enumerate(colors.items()):# 進(jìn)行參數(shù)更新self.lab[i] = rgbself.colorNames.append(name)# 進(jìn)行顏色空間的變換self.lab = cv2.cvtColor(self.lab, cv2.COLOR_RGB2LAB)def label(self, image, c):# 根據(jù)輪廓構(gòu)造一個(gè)mask,然后計(jì)算mask區(qū)域的平均值 mask = np.zeros(image.shape[:2], dtype="uint8")cv2.drawContours(mask, [c], -1, 255, -1)mask = cv2.erode(mask, None, iterations=2)mean = cv2.mean(image, mask=mask)[:3]# 初始化最小距離minDist = (np.inf, None)# 遍歷已知的LAB顏色值for (i, row) in enumerate(self.lab):# 計(jì)算當(dāng)前l(fā)*a*b*顏色值與圖像平均值之間的距離d = dist.euclidean(row[0], mean)# 如果當(dāng)前的距離小于最小的距離,則進(jìn)行變量更新if d < minDist[0]:minDist = (d, i)# 返回最小距離對(duì)應(yīng)的顏色值return self.colorNames[minDist[1]]

2、 創(chuàng)建一個(gè)形狀檢測(cè)類(lèi)

# coding=utf-8 import cv2# 創(chuàng)建形狀檢測(cè)類(lèi) class ShapeDetector:def __init__(self):passdef detect(self, c):# 初始化形狀名和近似的輪廓shape = "unidentified"peri = cv2.arcLength(c, True)approx = cv2.approxPolyDP(c, 0.04 * peri, True)# 如果當(dāng)前的輪廓含有3個(gè)頂點(diǎn),則其為三角形if len(approx) == 3:shape = "triangle"# 如果當(dāng)前的輪廓含有4個(gè)頂點(diǎn),則其可能是矩形或者正方形elif len(approx) == 4:# 獲取輪廓的邊界框并計(jì)算長(zhǎng)和寬的比例(x, y, w, h) = cv2.boundingRect(approx)ar = w / float(h)shape = "square" if ar >= 0.95 and ar <= 1.05 else "rectangle"# 如果這個(gè)輪廓含有5個(gè)頂點(diǎn),則它是一個(gè)多邊形elif len(approx) == 5:shape = "pentagon"# 否則的話(huà),我們認(rèn)為它是一個(gè)圓else:shape = "circle"# 返回形狀的名稱(chēng)return shape

3、主函數(shù)

# coding=utf-8 # python detect_color.py --image example_shapes.png# 導(dǎo)入一些python包 from shapedetector import ShapeDetector from colorlabeler import ColorLabeler import argparse import imutils import cv2# 設(shè)置并解析參數(shù) ap = argparse.ArgumentParser() ap.add_argument("-i", "--image", required=True, help="path to the input image") args = vars(ap.parse_args())# 讀取圖片 image = cv2.imread(args["image"]) # 進(jìn)行裁剪操作 resized = imutils.resize(image, width=300) ratio = image.shape[0] / float(resized.shape[0])# 進(jìn)行高斯模糊操作 blurred = cv2.GaussianBlur(resized, (5, 5), 0) # 進(jìn)行圖片灰度化 gray = cv2.cvtColor(blurred, cv2.COLOR_BGR2GRAY) # 進(jìn)行顏色空間的變換 lab = cv2.cvtColor(blurred, cv2.COLOR_BGR2LAB) # 進(jìn)行閾值分割 thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY)[1] cv2.imshow("Thresh", thresh)# 在二值圖片中尋找輪廓 cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts)# 初始化形狀檢測(cè)器和顏色標(biāo)簽 sd = ShapeDetector() cl = ColorLabeler()# 遍歷每一個(gè)輪廓 for c in cnts:# 計(jì)算每一個(gè)輪廓的中心點(diǎn)M = cv2.moments(c)cX = int((M["m10"] / M["m00"]) * ratio)cY = int((M["m01"] / M["m00"]) * ratio)# 進(jìn)行顏色檢測(cè)和形狀檢測(cè)shape = sd.detect(c)color = cl.label(lab, c)# 進(jìn)行坐標(biāo)變換c = c.astype("float")c *= ratioc = c.astype("int")text = "{} {}".format(color, shape)# 繪制輪廓并顯示結(jié)果cv2.drawContours(image, [c], -1, (0, 255, 0), 2)cv2.putText(image, text, (cX, cY), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)cv2.imshow("Image", image)cv2.waitKey(0)

運(yùn)行方法:python detect_color.py --image example_shapes.png

五、算法效果展示與分析


??上圖展示了該算法的一些中間結(jié)果,第1行第1列表示的是裁剪之后的結(jié)果,與代碼中的resized 對(duì)應(yīng);第1行第2列表示的是mask圖像;第1行第3列表示的是二值化的結(jié)果,和代碼中的thresh 對(duì)應(yīng)。通過(guò)觀(guān)察上圖我們可以發(fā)現(xiàn),該算法可以很好的對(duì)輸入圖片進(jìn)行二值化,可以準(zhǔn)確的檢測(cè)到不同的輪廓。

??上圖展示了算法的輸出結(jié)果,通過(guò)觀(guān)察上圖我們可以獲得一些信息,即該算法可以很好的檢測(cè)到不同的輪廓,并準(zhǔn)確的輸出不同輪廓的顏色和形狀信息。

參考資料

[1] 參考鏈接

注意事項(xiàng)

[1] 該博客是本人原創(chuàng)博客,如果您對(duì)該博客感興趣,想要轉(zhuǎn)載該博客,請(qǐng)與我聯(lián)系(qq郵箱:1575262785@qq.com),我會(huì)在第一時(shí)間回復(fù)大家,謝謝大家的關(guān)注.
[2] 由于個(gè)人能力有限,該博客可能存在很多的問(wèn)題,希望大家能夠提出改進(jìn)意見(jiàn)。
[3] 如果您在閱讀本博客時(shí)遇到不理解的地方,希望您可以聯(lián)系我,我會(huì)及時(shí)的回復(fù)您,和您交流想法和意見(jiàn),謝謝。
[4] 本文測(cè)試的圖片可以通過(guò)該鏈接進(jìn)行下載。網(wǎng)盤(pán)鏈接- 提取碼:tiv9 。
[5] 本人業(yè)余時(shí)間承接各種本科畢設(shè)設(shè)計(jì)和各種小項(xiàng)目,包括圖像處理(數(shù)據(jù)挖掘、機(jī)器學(xué)習(xí)、深度學(xué)習(xí)等)、matlab仿真、python算法及仿真等,有需要的請(qǐng)加QQ:1575262785詳聊,備注“項(xiàng)目”!!!

總結(jié)

以上是生活随笔為你收集整理的Python+Opencv颜色和形状检测的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。