第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用 OpenCV 獲得金屬光澤物體的輪廓

如何使用 OpenCV 獲得金屬光澤物體的輪廓

繁星淼淼 2022-07-26 11:00:26
我試圖找到金屬光澤物體的輪廓,如下圖所示:我使用 OpenCV 的 Canny 來獲取圖像的輪廓;但是,結(jié)果(下圖)確實繪制了原始圖像的完整輪廓。它在右下角有一個很大的突破。我懇請任何類型的資源可以幫助我完善我的輪廓,使其連續(xù)并且(非常接近)與原始圖像的形狀相似。
查看完整描述

3 回答

?
波斯汪

TA貢獻1811條經(jīng)驗 獲得超4個贊

這是另一種可能的解決方案,用 C++ 實現(xiàn)并使用k-means作為主要分割方法。這種分割背后的想法是 k-means(一種聚類方法)將對相似值的顏色進行分組。在這里,我設(shè)置 k-means 來查找 2 種顏色的簇:背景色和前景色。


讓我們看一下代碼:


std::string imageName = "C://opencvImages/LSl42.jpg";

cv::Mat testImage =  cv::imread( imageName );

//apply Gaussian Blur to smooth out the input:

cv::GaussianBlur( testImage, testImage, cv::Size(3,3), 0, 0 );

您的圖像具有嘈雜(高頻)的背景。您可以稍微模糊一下以獲得更平滑的漸變并改善分割。我應(yīng)用了標(biāo)準(zhǔn)內(nèi)核大小為 3 x 3 的高斯模糊。檢查輸入和平滑圖像之間的差異:

在此處輸入圖像描述

很酷?,F(xiàn)在,我可以將此圖像傳遞給 K-means。imageQuantization是從這里獲取的一個函數(shù),它實現(xiàn)了基于 K-means 的分割。正如我所提到的,它可以將具有相似值的顏色分組到集群中。這非常方便!讓我們將顏色分為兩組:前景對象和背景

int segmentationClusters = 2; //total number of clusters in which the input will be segmented...int iterations = 5; // k-means iterationscv::Mat segmentedImage = imageQuantization( testImage, segmentationClusters, iterations );

結(jié)果:

在此處輸入圖像描述

很不錯,嗯?

您可以直接在此圖像上應(yīng)用邊緣檢測,但我想使用一點形態(tài)學(xué)來改進它。我首先將圖像轉(zhuǎn)換為灰度,應(yīng)用 Outsu 的閾值,然后執(zhí)行形態(tài)閉合:

//compute grayscale image of the segmented output:cv::Mat grayImage;cv::cvtColor( segmentedImage, grayImage, cv::COLOR_RGB2GRAY );//get binary image via Otsu:cv::Mat binImage;cv::threshold( grayImage, binImage, 0, 255, cv::THRESH_OTSU );//Perform a morphological closing to lose up holes in the target blob:cv::Mat SE = cv::getStructuringElement( cv::MORPH_RECT, cv::Size(3, 3) );cv::morphologyEx( binImage, binImage, cv::MORPH_CLOSE, SE, cv::Point(-1,-1), 10 );

我使用大小為 3x3 的矩形結(jié)構(gòu)元素和 10 次關(guān)閉操作迭代,結(jié)果如下:

在此處輸入圖像描述

接下來,使用 Canny 的邊緣檢測器檢測邊緣:

cv::Mat testEdges;//setup lower and upper thresholds for Canny’s edge detection:float lowerThreshold = 30;float upperThreshold = 3 * lowerThreshold;cv::Canny( binImage, testEdges, lowerThreshold, upperThreshold );

最后,獲取 blob 的輪廓:

std::vector<std::vector<cv::Point> > contours;std::vector<cv::Vec4i> hierarchy;cv::findContours( testEdges, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );for( int i = 0; i< contours.size(); i++ ){
 cv::Scalar color = cv::Scalar( 0,255,0 );
 cv::drawContours( resizedImage, contours, i, color, 2, 8, hierarchy, 0, cv::Point() );}

這是我得到的最終結(jié)果:

在此處輸入圖像描述

想通過擴展輪廓來改善結(jié)果?在將二進制圖像傳遞給 Canny 的邊緣檢測之前,嘗試通過幾次迭代來擴大二進制圖像。這是一個測試,將圖像放大 5 次:

在此處輸入圖像描述


查看完整回答
反對 回復(fù) 2022-07-26
?
長風(fēng)秋雁

TA貢獻1757條經(jīng)驗 獲得超7個贊

在 Python/OpenCV 中,您可以通過以下方式實現(xiàn):

  • 讀取輸入

  • 轉(zhuǎn)換為 HSV 顏色空間并提取飽和度通道(因為灰色沒有飽和度,而綠色有)

  • 模糊圖像以減少噪點

  • 臨界點

  • 應(yīng)用形態(tài)接近填充閃亮物體的內(nèi)部孔

  • 找到輪廓并過濾最大的(盡管應(yīng)該只有一個)

  • 在輸入圖像上繪制輪廓

  • 保存結(jié)果

輸入:

http://img1.sycdn.imooc.com//62df59060001e74e02690483.jpg

import cv2

import numpy as np


# read input

img = cv2.imread('shiny.jpg')


# convert to hsv and get saturation channel

sat = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)[:,:,1]


# do a little Gaussian filtering

blur = cv2.GaussianBlur(sat, (3,3), 0)



# threshold and invert to create initial mask

mask = 255 - cv2.threshold(blur, 100, 255, cv2.THRESH_BINARY)[1]


# apply morphology close to fill interior regions in mask

kernel = np.ones((15,15), np.uint8)

mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)



# get outer contours from inverted mask and get the largest (presumably only one due to morphology filtering)

cntrs = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cntrs = cntrs[0] if len(cntrs) == 2 else cntrs[1]

result = img.copy()

area_thresh = 0

for c in cntrs:

    area = cv2.contourArea(c)

    if area > area_thresh:

        area = area_thresh

        big_contour = c


# draw largest contour

cv2.drawContours(result, [big_contour], -1, (0,0,255), 2)



# write result to disk

cv2.imwrite("shiny_mask.png", mask)

cv2.imwrite("shiny_outline.png", result)


# display it

cv2.imshow("IMAGE", img)

cv2.imshow("MASK", mask)

cv2.imshow("RESULT", result)

cv2.waitKey(0)


閾值和過濾蒙版:

http://img1.sycdn.imooc.com//62df59110001971a02140432.jpg

結(jié)果:

http://img1.sycdn.imooc.com//62df591b000119cc02260423.jpg

另一種方法是在綠色上使用 cv2.inRange() 來設(shè)置閾值。



查看完整回答
反對 回復(fù) 2022-07-26
?
慕田峪7331174

TA貢獻1828條經(jīng)驗 獲得超13個贊

一種簡單的方法是應(yīng)用大的高斯模糊 來平滑圖像,然后自適應(yīng)閾值。假設(shè)對象是圖像中最大的東西,我們可以找到輪廓,然后使用輪廓區(qū)域過濾對最大的輪廓進行排序。

二進制圖像

http://img1.sycdn.imooc.com//62df59300001031603000524.jpg

結(jié)果

http://img1.sycdn.imooc.com//62df59390001c97502490446.jpg

代碼


import cv2

import numpy as np


# Load image, convert to grayscale, Gaussian Blur, adaptive threshold

image = cv2.imread('1.jpg')

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

blur = cv2.GaussianBlur(gray, (13,13), 0)

thresh = cv2.adaptiveThreshold(blur,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV,51,7)


# Morph close

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))

close = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=1)


# Find contours, sort for largest contour, draw contour

cnts = cv2.findContours(close, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

cnts = cnts[0] if len(cnts) == 2 else cnts[1]

cnts = sorted(cnts, key=cv2.contourArea, reverse=True)

for c in cnts:

    cv2.drawContours(image, [c], -1, (36,255,12), 2)

    break


cv2.imshow('thresh', thresh)

cv2.imshow('image', image)

cv2.waitKey()


查看完整回答
反對 回復(fù) 2022-07-26
  • 3 回答
  • 0 關(guān)注
  • 284 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號