python+opencv實現機器視覺基礎技術(2)(寬度測量,缺陷檢測,醫學處理)

来源:https://www.cnblogs.com/ITXiaoAng/archive/2020/05/03/12823040.html
-Advertisement-
Play Games

本篇博客接著講解機器視覺的有關技術和知識。包括寬度測量,缺陷檢測,醫學處理。 一:寬度測量 在傳統的自動化生產中,對於尺寸的測量,典型的方法就是千分尺、游標卡尺、塞尺等。而這些測量手段測量精度低、速度慢,無法滿足大規模的自動化生產需求。基於機器視覺的尺寸測量屬於非接觸式的測量,具有檢測精度高、速度快 ...


  本篇博客接著講解機器視覺的有關技術和知識。包括寬度測量,缺陷檢測,醫學處理。

一:寬度測量

  在傳統的自動化生產中,對於尺寸的測量,典型的方法就是千分尺、游標卡尺、塞尺等。而這些測量手段測量精度低、速度慢,無法滿足大規模的自動化生產需求。基於機器視覺的尺寸測量屬於非接觸式的測量,具有檢測精度高、速度快、成本低、安裝簡便等優點。可以檢測零件的各種尺寸,如長度、圓、角度、線弧等測量。

  利用python+opencv方法可以進行寬度的測量。步驟是先選取出一個矩形,然後進行閾值分割,再進行反色,邊緣提取之後進行點的選擇,輸出坐標做出兩條線段,根據線段進行矩形繪製,這樣之後就可以計算兩條直線之間的距離,也就是我們需要求得的寬度。

  OpenCV是一個c++庫,用於實時處理電腦視覺方面的問題,涵蓋了很多電腦視覺領域的模塊。配合python調用c++庫,可以很方便地進行寬度測量,實現要求。

  步驟如下:

1.導入需要的庫

import cv2
import cv2 as cv
import numpy as np
import imutils

2.讀取原圖像查看

img = cv2.imread("1.jpg")

3.截取部分圖像

  手動地進行選取我們感興趣的部分,然後截取出來。

img = imutils.resize(img, width=500)
roi = cv2.selectROI(windowName="image1", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
s = img[y:y+h,x:x+w]

4.反色

  截取後會出現空白區域很多黑色的情況,需要進行反色,用到的方法是255去除值。

# 反色
def colorReverse(src):
	height, width, channels = src.shape
	for row in range(height):
	    for list in range(width):
	        for c in range(channels):
	            pv = src[row, list, c]
	            src[row, list, c] = 255 - pv
	return src
src = colorReverse(s)

5.邊緣檢測去噪

x = cv2.Sobel(src,cv2.CV_16S,1,0)
y = cv2.Sobel(src,cv2.CV_16S,0,1)
absX = cv2.convertScaleAbs(x)   # 轉回uint8
absY = cv2.convertScaleAbs(y)
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)
result = colorReverse(dst)

6.輸出滑鼠選擇點的坐標

  之後進行的操作是利用滑鼠選擇點,並顯示坐標,可以判斷時候用滑鼠進行點擊操作,如果是的話,就可以輸出點的坐標在輸出框或者圖片上標記,把點擊函數作為參數,就可以在不點擊退出鍵的時候進行迴圈遞歸操作,知道最直到獲得想要點的坐標。

# 輸出滑鼠選擇點的坐標
# setMouseCallback使用的回調函數,這個回調函數在捕獲到滑鼠左鍵點擊事件時,就在圖片上點擊處繪製一個實心的圓、並顯示出坐標。
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        xy = "%d,%d" % (x, y)
        print (xy)
        cv2.circle(result, (x, y), 1, (255, 0, 0), thickness = -1)
        cv2.putText(result, xy, (x, y), cv2.FONT_HERSHEY_PLAIN,
                    1.0, (0,0,0), thickness = 1)
        cv2.imshow("image2", result)

cv2.namedWindow("image2")
cv2.setMouseCallback("image2", on_EVENT_LBUTTONDOWN)
cv2.imshow("image2", result)

7.繪製線段用輸出提示

  接下來就可以根據選擇的四個點進行連接輸出線段,用get_len()方法可以得到兩條線之間的距離。

# 繪製線段
s = cv2.line(result,(3, 30), (120, 30), (0, 255, 0), 2)
d = cv2.line(result,(3, 110), (118, 110), (0,255, 0), 2)
lens = s.get_len() - d.get_len()

# 輸出圖形
text = "寬為:{0}".format(lens)
cv.putText(result, text, (20, 20), cv.FONT_HERSHEY_COMPLEX, 2.0, (0, 255, 0), 1)


二:缺陷檢測

  缺陷檢測通常是指對物品錶面缺陷的檢測,錶面缺陷檢測是採用先進的機器視覺檢測技術,對工件錶面的斑點、凹坑、劃痕、色差、缺損等缺陷進行檢測。

  人工檢測是產品錶面缺陷的傳統檢測方法,該方法抽檢率低、準確性不高、實時性差、效率低、勞動強度大、受人工經驗和主觀因素的影響大,而基於機器視覺的檢測方法可以很大程度上剋服上述弊端。

  缺陷檢測被廣泛使用於布匹瑕疵檢測、工件錶面質量檢測、航空航天領域等。傳統的演算法對規則缺陷以及場景比較簡單的場合,能夠很好工作,但是對特征不明顯的、形狀多樣、場景比較混亂的場合,則不再適用。近年來,基於深度學習的識別演算法越來越成熟,許多公司開始嘗試把深度學習演算法應用到工業場合中。

  視覺錶面缺陷檢測系統基本組成主要包括圖像獲取模塊、圖像處理模塊、圖像分析模塊、數據管理及人機介面模塊。

  這裡是用python+opencv進行津彩啤酒的圖片缺陷檢測,將0.bmp圖片進行樣本,和其他圖片進行對比,檢測是否合格。通過對比原圖和要比較的圖像的24位灰度圖像進行檢測。

  步驟如下:

1.導入需要的庫

import cv2
import cv2 as cv
import numpy as np
from PIL import Image, ImageDraw, ImageFont

2.比較

  讀入我們0.bmp圖像作為比較因數,設置為rgbimage_std變數

rgbimage_std = cv.imread("0.bmp")

3.轉換

  將24位rgbimage_std彩色圖像轉換為8位rgb2grayimage_std灰度圖像

rgb2grayimage_std = cv2.cvtColor(rgbimage_std, cv2.COLOR_RGB2GRAY)

4.迴圈

  缺陷檢測演算法迴圈六次。

imagename = str(i) + '.bmp'
	rgbimage_defect = cv.imread(imagename)
	# 將每次imagename對應圖像在圖像視窗顯示出來
	# cv.imshow(imagename, rgbimage_defect)

	# 將24位rgbimage_defect彩色圖像轉換8位rgb2grayimage_defect灰度圖
	gray = np.array(rgbimage_defect)
	gray = gray[:,:,0]
	rgb2grayimage_defect = np.array([gray,gray,gray])
	rgb2grayimage_defect = np.transpose(rgb2grayimage_defect,(1,2,0))

	name = str(i) + '_rgb2grayimage_defect.bmp'
	# cv.imshow(name, rgb2grayimage_defect)

	# 缺陷比較
	# 直方圖計算的函數,反應灰度值的分佈情況
	be_compare_image = cv2.calcHist([rgb2grayimage_std], [0], None, [256], [0.0,255.0])
	compare_image = cv2.calcHist([rgb2grayimage_defect], [0], None, [256], [0.0,255.0])

	#相關性計算,採用相關係數的方式
	# result = cv2.compareHist(be_compare_image,compare_image,method=cv2.HISTCMP_CORREL)
	result = sum(be_compare_image - compare_image)[0]
	# 打開PIL創建的圖像
	ss = Image.open(str(i) + ".bmp")
	# 創建一個操作對象
	draw = ImageDraw.Draw(ss)
	# 字體對象為simsun,字大小為50號
	fnt = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', 50)
	# 如果圖片對比原圖相似度小於7,則合格;否則不合格。
	if result < 7:
	    draw.text((5, 10), u'合格', fill='red', font=fnt)
th_str = str(i) + '.bmp'
	draw.text((5, 350), th_str, fill='red', font=fnt)
	else:
	    draw.text((5, 10), u'不合格', fill='red', font=fnt)
th_str = str(i) + '.bmp'
draw.text((5, 350), th_str, fill='red', font=fnt)
	ss.show("result" +str(i) + ".png")







5.結束代碼

cv.waitKey(0)

三:醫學檢測

  醫學信息處理,即對醫學信息的處理,醫學信息處理過程中藉助電腦技術,具有非常高的應用價值,在提高信息處理準確度的同時,也極大地增強了信息處理的效率,為廣大患者與患者家屬創造更為人性化的就醫環境。

  利用電腦的先進技術可以對醫學圖像進行處理,然後更加方便地得到圖片上蘊含的信息,從而進行正快速地得到我們想要得到的信息。

  這裡是用python+opencv進行醫學圖像識別,藉助電腦技術幫助醫生對醫學圖像進行有效地分析。

  步驟如下:

1.導入庫

from skimage import data,color,morphology
import cv2 as cv
import cv2

2.讀入灰度圖

img1 = cv.imread('vas0.bmp',0)

3.反色

img3 = img2.copy()
cv2.threshold(img2,80,255,0,img2)
for i in range(0,img2.shape[0]):
    for j in range(0,img2.shape[1]):
        img3[i,j] = 255-img2[i,j]

  或者如下代碼:

# 對img2圖像圖像進行反色,得到img3圖像
def access_pixels(image):
    height, width, channels = image.shape
    for row in range(height):
        for list in range(width):
            for c in range(channels):
                pv = image[row, list, c]
                image[row, list, c] = 255 - pv
    return image
img3 = access_pixels(img2)


4.擴展

img4 = cv2.copyMakeBorder(img3,50,50,50,50,cv2.BORDER_REFLECT)

5.去噪

  去除雜訊位置地小面積區域,可以有兩種方式,一種是選擇滿足面積150-10000的img4圖像輸出,去除雜訊位置元素,另一種是使用Skimage中的形態學處理來進行孤立小區域的去除。

img5 = morphology.remove_small_holes(img4, 100)

  或者如下代碼:

contours,hierarchy  = cv2.findContours(img4, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
#消除小面積
for i in range(len(contours)):
    area = cv2.contourArea(contours[i])
    if area < 150:
        cv2.drawContours(img4,[contours[i]],0,0,-1)
img5 = img4

6.面積濾波

  用連通區域的面積除以連通區域包絡盒的面積,僅保留當這個比值小於用戶所給的div的值時的連通區域。

img5=img5.copy()
contours1,hierarchy = cv2.findContours(img5, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
for j in range(len(contours1)):
area1 = cv2.contourArea(contours1[j])
print(area1)
if area1 ==157.0:
    cv2.drawContours(img5,[contours1[j]],0,0,-1)
elif area1==261.5:
    cv2.drawContours(img5,[contours1[j]],0,0,-1)
elif area1==568.0:
    cv2.drawContours(img5,[contours1[j]],0,0,-1)

7.細化函數

  輸入需要細化的圖片(經過二值化處理的圖片)和映射矩陣array,並提取骨架。

def Thin(image, array):
    h, w = image.shape
    iThin = image

    for i in range(h):
        for j in range(w):
            if image[i, j] == 0:
                a = [1] * 9
                for k in range(3):
                    for l in range(3):
                        # 如果3*3矩陣的點不在邊界且這些值為零,也就是黑色的點
                        if -1 < (i - 1 + k) < h and -1 < (j - 1 + l) < w and iThin[i - 1 + k, j - 1 + l] == 0:
                            a[k * 3 + l] = 0
                sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128
                iThin[i, j] = array[sum] * 255
    return iThin
# 映射表
array = [0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\
         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\
         1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1,\
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1,\
         0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 1,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0,\
         1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0,\
         1, 1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0]
src = cv2.imread(r'img5.png', 0)
Gauss_img = cv2.GaussianBlur(src, (3,3), 0)
# 自適應二值化函數,需要修改的是55那個位置的數字,越小越精細,細節越好,噪點更多,最大不超過圖片大小
adap_binary = cv2.adaptiveThreshold(Gauss_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY,3,2)
img6 = Thin(adap_binary, array)

8.邊緣檢測

img7 = cv2.Canny(img6,80,255)

9.圖片反色

img8 = img7.copy()
cv2.threshold(img7,80,255,0,img7)
for i in range(0,img7.shape[0]):
    for j in range(0,img7.shape[1]):
        img8[i,j] = 255-img7[i,j]

10.結束函數

cv.waitKey(0)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 直接進入主題 爬蟲功能:此項目和QQ空間爬蟲類似,主要爬取新浪微博用戶的個人信息、微博信息、粉絲和關註(詳細見此)。還要註意:不管你是為了Python就業還是興趣愛好,記住:項目開發經驗永遠是核心,如果你沒有2020最新python入門到高級實戰視頻教程,可以去小編的Python交流.裙 :七衣衣九 ...
  • 會話控制是指網站與用戶之間跨頁面數據交互的一種解決方案,主要有cookie和session兩種。 COOKIE 使用本地文件處理跨頁面傳值,用戶的基本信息加密後保存到本地 安全性相對不高 用戶可以禁止cookie 存儲數據有大小限制(<4k) 不同瀏覽器存儲不同的cookie SESSION 在服務 ...
  • 需求如下: 1、在一個頁面中顯示兩張圖片 2、進入頁面可以使用滑鼠拖動各自的圖片,相互不受影響 3、進入頁面後可以使用滑鼠滾輪放大或縮小圖片,相互不受影響,即滑鼠移動到圖片A上,可對圖片A進行放大或縮小,圖片B不受影響,反之亦然 4、拖動需求同3 實現代碼: 參考網址: 1.https://matp ...
  • 通俗理解spring源碼(五)—— 解析及註冊BeanDefinitions 上節講到瞭如何獲取document,當把文件轉換為document後,接下來的提取及註冊bean就是我們的重頭戲。 protected int doLoadBeanDefinitions(InputSource input ...
  • Docker的一些概念 docker image docker鏡像 即容器模板,操作系統+軟體運⾏環境+⽤戶程式 類似於安裝操作系統的windows鏡像、centos鏡像,只是一個模板 Docker container docker容器 容器是從鏡像運行的實例,比如用tomcat鏡像運行tomcat ...
  • 一、問題 問題1 場景:如果你未來的丈母娘要求你,第1天給她1分錢,第2天給2分錢,第3天給4分錢,以此類推,每天給前一天的2倍,給1個月(按30天)算就行。問:第30天給多少錢,總共給多少錢? 問題2 場景:如果有兩份工作。 第1份:第1天給你1分錢,第2天給你2分錢,第3天給你4分錢,以此類推, ...
  • 本節常見面試題 如何判斷對象是否死亡(兩種方法)。 簡單的介紹一下強引用、軟引用、弱引用、虛引用(虛引用與軟引用和弱引用的區別、使用軟引用能帶來的好處)。 如何判斷一個常量是廢棄常量 如何判斷一個類是無用的類 堆中幾乎放著所有的對象實例,對堆垃圾回收前的第一步就是要判斷那些對象已經死亡(即不能再被任 ...
  • 1、深拷貝 --> 克隆一份,修改拷貝後的內容不對原對象內容產生影響 拷貝後修改序列中元素內容,註意:被修改的元素不能為一個序列中的某個值 a = [["北京多測師","成都多測師"],"上海多測師","深圳多測師","廣州多測師"] b = a.copy() b[1] = "天津多測師" prin ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...