python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学检测
?本篇博客接著講解機器視覺的有關技術和知識。包括寬度測量,缺陷檢測,醫(yī)學處理。
一:寬度測量
??在傳統(tǒng)的自動化生產中,對于尺寸的測量,典型的方法就是千分尺、游標卡尺、塞尺等。而這些測量手段測量精度低、速度慢,無法滿足大規(guī)模的自動化生產需求?;跈C器視覺的尺寸測量屬于非接觸式的測量,具有檢測精度高、速度快、成本低、安裝簡便等優(yōu)點??梢詸z測零件的各種尺寸,如長度、圓、角度、線弧等測量。
??利用python+opencv方法可以進行寬度的測量。步驟是先選取出一個矩形,然后進行閾值分割,再進行反色,邊緣提取之后進行點的選擇,輸出坐標做出兩條線段,根據(jù)線段進行矩形繪制,這樣之后就可以計算兩條直線之間的距離,也就是我們需要求得的寬度。
??OpenCV是一個c++庫,用于實時處理計算機視覺方面的問題,涵蓋了很多計算機視覺領域的模塊。配合python調用c++庫,可以很方便地進行寬度測量,實現(xiàn)要求。
??步驟如下:
1.導入需要的庫
import cv2 import cv2 as cv import numpy as np import imutils2.讀取原圖像查看
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.反色
??截取后會出現(xiàn)空白區(qū)域很多黑色的情況,需要進行反色,用到的方法是255去除值。
# 反色 def colorReverse(src):height, width, channels = src.shapefor row in range(height):for list in range(width):for c in range(channels):pv = src[row, list, c]src[row, list, c] = 255 - pvreturn 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.輸出鼠標選擇點的坐標
??之后進行的操作是利用鼠標選擇點,并顯示坐標,可以判斷時候用鼠標進行點擊操作,如果是的話,就可以輸出點的坐標在輸出框或者圖片上標記,把點擊函數(shù)作為參數(shù),就可以在不點擊退出鍵的時候進行循環(huán)遞歸操作,知道最直到獲得想要點的坐標。
# 輸出鼠標選擇點的坐標 # setMouseCallback使用的回調函數(shù),這個回調函數(shù)在捕獲到鼠標左鍵點擊事件時,就在圖片上點擊處繪制一個實心的圓、并顯示出坐標。 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.繪制線段用輸出提示
??接下來就可以根據(jù)選擇的四個點進行連接輸出線段,用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)二:缺陷檢測
??缺陷檢測通常是指對物品表面缺陷的檢測,表面缺陷檢測是采用先進的機器視覺檢測技術,對工件表面的斑點、凹坑、劃痕、色差、缺損等缺陷進行檢測。
??人工檢測是產品表面缺陷的傳統(tǒng)檢測方法,該方法抽檢率低、準確性不高、實時性差、效率低、勞動強度大、受人工經驗和主觀因素的影響大,而基于機器視覺的檢測方法可以很大程度上克服上述弊端。
??缺陷檢測被廣泛使用于布匹瑕疵檢測、工件表面質量檢測、航空航天領域等。傳統(tǒng)的算法對規(guī)則缺陷以及場景比較簡單的場合,能夠很好工作,但是對特征不明顯的、形狀多樣、場景比較混亂的場合,則不再適用。近年來,基于深度學習的識別算法越來越成熟,許多公司開始嘗試把深度學習算法應用到工業(yè)場合中。
??視覺表面缺陷檢測系統(tǒng)基本組成主要包括圖像獲取模塊、圖像處理模塊、圖像分析模塊、數(shù)據(jù)管理及人機接口模塊。
??這里是用python+opencv進行津彩啤酒的圖片缺陷檢測,將0.bmp圖片進行樣本,和其他圖片進行對比,檢測是否合格。通過對比原圖和要比較的圖像的24位灰度圖像進行檢測。
??步驟如下:
1.導入需要的庫
import cv2 import cv2 as cv import numpy as np from PIL import Image, ImageDraw, ImageFont2.比較
??讀入我們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.循環(huán)
??缺陷檢測算法循環(huán)六次。
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)# 缺陷比較# 直方圖計算的函數(shù),反應灰度值的分布情況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])#相關性計算,采用相關系數(shù)的方式# result = cv2.compareHist(be_compare_image,compare_image,method=cv2.HISTCMP_CORREL)result = sum(be_compare_image - compare_image)[0]# 打開PIL創(chuàng)建的圖像ss = Image.open(str(i) + ".bmp")# 創(chuàng)建一個操作對象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)三:醫(yī)學檢測
??醫(yī)學信息處理,即對醫(yī)學信息的處理,醫(yī)學信息處理過程中借助計算機技術,具有非常高的應用價值,在提高信息處理準確度的同時,也極大地增強了信息處理的效率,為廣大患者與患者家屬創(chuàng)造更為人性化的就醫(yī)環(huán)境。
??利用計算機的先進技術可以對醫(yī)學圖像進行處理,然后更加方便地得到圖片上蘊含的信息,從而進行正快速地得到我們想要得到的信息。
??這里是用python+opencv進行醫(yī)學圖像識別,借助計算機技術幫助醫(yī)生對醫(yī)學圖像進行有效地分析。
??步驟如下:
1.導入庫
from skimage import data,color,morphology import cv2 as cv import cv22.讀入灰度圖
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.shapefor row in range(height):for list in range(width):for c in range(channels):pv = image[row, list, c]image[row, list, c] = 255 - pvreturn image img3 = access_pixels(img2)4.擴展
img4 = cv2.copyMakeBorder(img3,50,50,50,50,cv2.BORDER_REFLECT)5.去噪
??去除噪聲位置地小面積區(qū)域,可以有兩種方式,一種是選擇滿足面積150-10000的img4圖像輸出,去除噪聲位置元素,另一種是使用Skimage中的形態(tài)學處理來進行孤立小區(qū)域的去除。
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 = img46.面積濾波
??用連通區(qū)域的面積除以連通區(qū)域包絡盒的面積,僅保留當這個比值小于用戶所給的div的值時的連通區(qū)域。
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.細化函數(shù)
??輸入需要細化的圖片(經過二值化處理的圖片)和映射矩陣array,并提取骨架。
def Thin(image, array):h, w = image.shapeiThin = imagefor i in range(h):for j in range(w):if image[i, j] == 0:a = [1] * 9for 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] = 0sum = a[0] * 1 + a[1] * 2 + a[2] * 4 + a[3] * 8 + a[5] * 16 + a[6] * 32 + a[7] * 64 + a[8] * 128iThin[i, j] = array[sum] * 255return 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) # 自適應二值化函數(shù),需要修改的是55那個位置的數(shù)字,越小越精細,細節(jié)越好,噪點更多,最大不超過圖片大小 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.結束函數(shù)
cv.waitKey(0)總結
以上是生活随笔為你收集整理的python+opencv实现机器视觉基础技术(2)(宽度测量,缺陷检测,医学检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux——服务器与客户端实现聊天功能
- 下一篇: 带头节点循环链表实现队列