【人工智能學習之圖像操作(六)】

【人工智能學習之圖像操作(六)】

  • Hough變換
    • 直線檢測
    • 圓檢測
  • 圖像分割

Hough變換

在圖像處理中,霍夫變換用來檢測任意能夠用數學公式表達的形狀,即使這個形狀被破壞或者有點扭曲

直線檢測

import cv2
import numpy as np
image = cv2.imread("1.jpg")
image = cv2.GaussianBlur(image, (5, 5), 50)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
cv2.imshow("image_gray", image_gray)
edges = cv2.Canny(image_gray, 100, 150)
cv2.imshow("image_edges", edges)
lines = cv2.HoughLines(edges, 1, np.pi / 180, 100)
for line in lines:
rho, theta = line[0]
a = np.cos(theta)
b = np.sin(theta)
x0 = a * rho
y0 = b * rho
x1 = int(x0 + 1000 * (-b)) # 直線起點橫坐標
y1 = int(y0 + 1000 * (a)) # 直線起點縱坐標
x2 = int(x0 - 1000 * (-b)) # 直線終點橫坐標
y2 = int(y0 - 1000 * (a)) # 直線終點縱坐標
cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
cv2.imshow("image_lines", image)
cv2.waitKey(0)

在這里插入圖片描述

圓檢測

import cv2
import numpy as np
image = cv2.imread("2.jpg")
dst = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
circle = cv2.HoughCircles(dst, cv2.HOUGH_GRADIENT, 1, 30, param1=40, param2=20,
minRadius=20, maxRadius=300)
if not circle is None:
circle = np.uint16(np.around(circle))
for i in circle[0, :]:
cv2.circle(image, (i[0], i[1]), i[2], (0, 255, 0), 2)
cv2.imshow("circle", image)
cv2.waitKey(0)

在這里插入圖片描述
原理詳解
步驟:

  • 輪廓檢測算法檢測出輪廓
  • 投射到hough空間進行形狀檢測

數學原理
在這里插入圖片描述
在這里插入圖片描述

圖像分割

函數:cv2.watershed()

  • 原理:
    任何一副灰度圖像都可以被看成拓撲平面,灰度值高的區域可以被看成是山峰,灰度值低的區域可以被看成是山谷。我們向每一個山谷中灌不同顏色的水。隨著水的位的升高,不同山谷的水就會相遇匯合,為了防止不同山谷的水匯合,我們需要在水匯合的地方構建起堤壩。不停的灌水,不停的構建堤壩知道所有的山峰都被水淹沒。我們構建好的堤壩就是對圖像的分割。這就是分水嶺算法的背后哲理。
    但是這種方法通常都會得到過度分割的結果,這是由噪聲或者圖像中其他不規律的因素造成的。為了減少這種影響,OpenCV 采用了基于掩模的分水嶺算法,在這種算法中我們要設置那些山谷點會匯合,那些不會。這是一種交互式的圖像分割。我們要做的就是給我們已知的對象打上不同的標簽。如果某個區域肯定是前景或對象,就使用某個顏色(或灰度值)標簽標記它。如果某個區域肯定不是對象而是背景就使用另外一個顏色標簽標記。而剩下的不能確定是前景還是背景的區域就用 0 標記。這就是我們的標簽。然后實施分水嶺算法。每一次灌水,我們的標簽就會被更新,當兩個不同顏色的標簽相遇時就構建堤壩,直到將所有山峰淹沒,最后我們得到的邊界對象(堤壩)的值為 -1。
  • 代碼示例
import numpy as np
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('1.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV |
cv2.THRESH_OTSU)
# noise removal
kernel = np.ones((3, 3), np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=2)
# sure background area
sure_bg = cv2.dilate(opening, kernel, iterations=3)
dist_transform = cv2.distanceTransform(opening, 1, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7 * dist_transform.max(), 255, 0)
# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
# Marker labelling
ret, markers1 = cv2.connectedComponents(sure_fg)
# Add one to all labels so that sure background is not 0, but 1
markers = markers1 + 1
# Now, mark the region of unknown with zero
markers[unknown == 255] = 0
markers3 = cv2.watershed(img, markers)
img[markers3 == -1] = [255, 0, 0]
cv2.imshow("img", img)
cv2.waitKey(0)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37956.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

利用微信開放標簽<wx-open-launch-weapp>在H5中跳轉微信小程序報錯完美的解決方案

一、報錯&#xff1a; [WXTAG] [JSCORE] The slot <template> or <script type"text/wxtag-template"> of <wx-open-launch-weapp> is missing 二、源碼 官方源代碼如下&#xff0c;<script type"text/wxtag-template"></sc…

美團外賣搜索基于Elasticsearch的優化實踐--圖文解析

美團外賣搜索基于Elasticsearch的優化實踐–圖文解析 前言 美團在外賣搜索業務場景中大規模地使用了 Elasticsearch 作為底層檢索引擎&#xff0c;隨著業務量越來越大&#xff0c;檢索速度變慢了&#xff0c;CPU快累趴了&#xff0c;所以要進行優化。經過檢測&#xff0c;發現…

gcop:簡化 Git 提交流程的高效助手 | 一鍵生成 commit message

&#x1f496; 大家好&#xff0c;我是Zeeland。Tags: 大模型創業、LangChain Top Contributor、算法工程師、Promptulate founder、Python開發者。&#x1f4e3; 個人說明書&#xff1a;Zeeland&#x1f4e3; 個人網站&#xff1a;https://me.zeeland.cn/&#x1f4da; Github…

[SAP ABAP] 數據字典

ABAP數據字典是定義和管理數據庫對象的工具 系統的所有全局數據類型以及數據庫表結構等都需要在數據字典中創建和維護(數據字典中的對象對所有ABAP程序都是全局的) 通過數據字典&#xff0c;我們可以把數據庫對象管理好&#xff0c;后續才能順利的進行功能開發&#xff0c;SA…

華為面試題及答案——大數據

(1)namenode內存滿了,如何進行擴容,調什么參數。 1. 增加 NameNode 的內存 在 hadoop-env.sh 文件中,可以增加 JVM 分配給 NameNode 的內存。通常是在 HADOOP_NAMENODE_OPTS 中增加 -Xmx 參數來增加最大堆內存。 export HADOOP_NAMENODE_OPTS="-Xmx8g -Xms4g ${HA…

集合,Collection接口

可動態保存任意多個對象&#xff0c;使用比較方便 提供了一系列方便操作對象的方法&#xff1a;add&#xff0c;remove&#xff0c;set&#xff0c;get等 使用集合添加刪除新元素&#xff0c;代碼簡潔明了 單列集合 多列集合 Collection接口 常用方法 List list new Arra…

設計模式詳解(一)——策略模式

策略模式&#xff08;Strategy Pattern&#xff09;是一種行為型的設計模式&#xff0c;它允許你定義一系列算法&#xff0c;然后將它們封裝起來&#xff0c;使它們可以相互替換。這樣做的好處是&#xff0c;你可以動態地選擇要使用的算法&#xff0c;而不必在運行時進行檢查或…

多媒體基礎

筆者按&#xff1a; 昨日復習的信息網絡安全約莫是掛了&#xff0c;常言道&#xff1a;知恥而后勇。誠如斯言 于是決心多媒體是不能再掛了&#xff0c;不然直接變成xxx之流&#xff0c;自增笑耳 語雀鏈接&#xff1a;多媒體基礎 一.多媒體計算機概述 媒體&#xff1a;承載信息…

動手學深度學習(Pytorch版)代碼實踐 -卷積神經網絡-21多輸入多輸出通道

21多輸入多輸出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""計算二維互相關運算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

go語言DAY7 字典Map 指針 結構體 函數

Go中Map底層原理剖析_go map底層實現-CSDN博客 目錄 Map 鍵值對key,value 注意&#xff1a; map唯一確定的key值通過哈希運算得出哈希值 一、 map的聲明及初始化&#xff1a; 二、 map的增刪改查操作&#xff1a; 三、 map的賦值操作與切片對比&#xff1a; 四、 通用所有…

[leetcode hot 150]第一百二十二題,買賣股票的最佳時機Ⅱ

題目&#xff1a; 給你一個整數數組 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的價格。 在每一天&#xff0c;你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買&#xff0c;然后在 同一天 出售。 返回 你能獲得的 最大…

【C++】初識C++(一)

一.什么是C C語言是結構化和模塊化的語言&#xff0c;適合處理較小規模的程序。對于復雜的問題&#xff0c;規模較大的程序&#xff0c;需要高度 的抽象和建模時&#xff0c;C語言則不合適。為了解決軟件危機&#xff0c; 20世紀80年代&#xff0c; 計算機界提出了OOP(object o…

圖形處理單元(GPU)在現代計算中的應用與挑戰(研究論文框架)

摘要:隨著高性能計算需求的日益增長,圖形處理單元(GPU)已從專業的圖形渲染處理器轉變為具有高性能并行處理能力的多功能計算平臺。本文將探討GPU的核心優勢、編程模型、在不同領域的應用以及面臨的挑戰和限制。此外,還將討論GPU技術的未來發展趨勢和潛在的研究機會。 關鍵…

mongodb 查詢語句學習筆記

基礎查詢 正則查詢 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查詢 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查詢 { $or: [ { status: "A" }, { qty: { $lt: 30 } …

2024年機動車簽字授權人題庫,助你沖刺!絕對不會讓你后悔!

61.&#xff08;&#xff09;使汽車按駕駛人選定的方向行駛。 A.傳動系統 B.行駛系統 C.轉向系統 D.制動系統 答案&#xff1a;C 62.&#xff08;&#xff09;使汽車各總成及部件安裝在適當的位置&#xff0c;對全車起支承作用以保證汽車正常行駛。 A.傳動系統 B.行駛系…

01.計算機圖形學概述

01.計算機圖形學概述 從技術的角度上看&#xff0c;什么是一個好的畫面&#xff1f; 直接看這個畫面是不是足夠亮&#xff0c;這體現了渲染中的一個技術叫全局光照。 應用范圍 游戲&#xff08; Video Games&#xff09;電影/特效&#xff08; Movies&#xff09;動漫/動畫&…

如何讓Linux系統變得更安全?

本文嘗試從linux安全加固、漏洞利用及防御措施、安全意識三個方面思考如何讓linux系統變得更加安全. 一、linux常見安全加固操作 對Linux系統進行詳細的安全加固操作,可以從多個方面進行,包括系統更新和補丁管理、用戶和權限管理、網絡安全配置、文件和系統安全、日志和審計…

Qt代碼分析

要使用代碼分析工具&#xff0c;請在Analyze菜單或(Start Debugging of Startup Project)按鈕的下拉菜單中選擇它。當您處于調試模式時&#xff0c;您可以通過在調試器工具欄上的菜單中選擇工具來切換工具。 您可以將調試模式下的視圖拖放到屏幕上的新位置。意見的大小和立場將…

c++關鍵字default,delete

文章目錄 概述defaultdelete 小結 概述 在看一些開源項目的源碼的時候&#xff0c;經常會看到default和delete。這2個關鍵字究竟什么意思呢&#xff1f;這篇文章就來一點一點拆解下。 default 默認構造函數、拷貝構造函數、移動構造函數、拷貝賦值運算符、移動賦值運算符和析…

HDFS學習

3.5 HDFS存儲原理 3.5.1 冗余數據保存 作為一個分布式文件系統&#xff0c;為了保證系統的容錯性和可用性&#xff0c;HDFS采用了多副本方式對數據進行冗余存儲&#xff0c;通常一個數據塊的多個副本會被分布到不同的數據節點上。 如圖所示&#xff0c;數據塊1被分別存放到…