2020-09-05

tech2023-06-01  60

图片预处理

import cv2 as cv # 导入opencv库 img = cv.imread('x.jpg') # x.jpg是在该文件下的图片名称 x = img[0:200,0:300] # 对图片截取部分 cv.namedWindow('cs',cv.WINDOW_NORMAL) cv.imshow('cs',bwgray) cv.waitKey(0) cv.destroyALLWindows() ``#图像显示 ` top_size,bottom_size,left_size,right_size = (50,50,50,50) f = cv.copyMakeBorder(img,top_size,bottom_size,left_size,right_size,borderType=cv.BORDER_REPLICATE) #对图像进行扩展 borderType=cv.BORDER_REPLICATE表示拓展的方法,有很多种 ret,bwgray = cv.threshold(gray_im,127,255,cv.THRESH_BINARY) #灰度图像二值化 # gray_im表示原图像名 127为设定的阈值,255为最大像素,cv.THRESH_BINARY表示处理的方法,还有很多种 blur = cv.blur(img,(3,3)) # 均值滤波去噪点 aussian = cv.GaussianBlur(img,(3,3),1) #高斯滤波去噪音点 ,其中1表示x方向差值 median = cv.medianBlur(img,5) #中值滤波去噪音点,其中5表示核大小,必须是大于1的奇数 kernel=np.ones((3,3),np.uint8) dige_erosion=cv2.erode(img,kernel,iterations = 1) #图像腐蚀操作 kernel是定义核的大小,img图像名,iterations = 1是迭代次数 kernel=np.ones((3,3),np.uint8) dige_dilate=cv2.dilate(dige_ersion,kernel,iterations = 1) #膨胀操作 kernel=np.ones((3,3),np.uint8) opening = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)#cv2.MORPH_OPEN开运算 #开运算:先腐蚀,后膨胀 kernel=np.ones((3,3),np.uint8) closing = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)#cv2.MORPH_CLOSE闭运算 #闭运算:先膨胀,后腐蚀 kernel=np.ones((3,3),np.uint8) gradient=cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel) #梯度运算,得到轮廓信息:执行原图膨胀减去原图腐蚀的差值,cv2.MORPH_GRADIENT表示梯度运算 #礼帽 tophat=cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel) #黑帽 blackhat=cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel) #礼帽 = 原始输入 - 开运算结果 #黑帽 = 闭运算 - 原始输入 #图像梯度计算 #sobel算子 dst=cv2.Sobel(src,ddepth,dx,dy,[ksize]) # ddeph:处理结果图像深度 #在处理一般的8位图像时,当计算的梯度小于0时,会自动变为0,造成边界信息的丢失。因此一般讲ddeph设为#cv2.CV_64F(即可以有负值),然后用函数讲结果图像转为8位的图像 sobelx=cv2.convertScaleAbs(sobelx) #之前处理完可能有负值,这个函数是取绝对值,变成正值,sobelx表示要处理的图像名称 # dx,dy表示x轴还是y轴方向计算 , [ksize]表示卷积核大小,在代码中直接写ksize=x(数值),dx,dy是0还是1, #一般来说求取边界是,分别取dx=1,dy=1,然后将两个边界图像相加,不要将dx,dy同时等于1,分开计算效果会更好 dst=cv2.addWeighted(src1,alpha,src2,beat,gamma) #将两个分别计算的图像相加的函数 ,src1是Gx或者Gy,(即在x方向或y方向),alpha,beat权重参数,gamma偏置,一般为0就可以。 #scharr算子:原理和sobel算子原理一样,只是卷积核不一样,因此准确度更高一点(即图片细节清楚一些) dst=Scharr(src,ddepth,dx,dy) # 梯度计算实例 import cv2 import numpy as np img=cv2.imread("3.png",cv2.IMREAD_UNCHANGED) sobelx=cv2.Sobel(img,cv2.CV_64F,dx=1,dy=0) sobelx=cv2.convertScaleAbs(sobelx) sobely=cv2.Sobel(img,cv2.CV_64F,dx=0,dy=1) sobely=cv2.convertScaleAbs(sobely) result=cv2.addWeighted(sobelx,0.5,sobely,0.5,0) cv2.imshow("priginal",img) cv2.imshow("sobelx",sobelx) cv2.imshow("sobely",sobely) cv2.imshow("result",result) cv2.waitKey() cv2.destroyAllWindows( #边缘检测 双阈值处理 v1 = cv2.Canny(img,minVal,maxVal) #minVal设置的越小,细节轮廓会更多,maxVal越大,细节轮廓越少。 #图像金字塔与轮廓检测 #高斯金字塔 t = cv2.pyrUp(img) cv_show(t,'t') # 向下采样(即将图片缩小) t = cv2.pyrDown(img) cv_show(t,'t') # 向上采样 (即图片放大) #轮廓检测函数 cv2.findContours(img,mode,method) #mode :轮廓检测模式 一般只需要用cv2.RETR_TREE:检测所以轮廓,并重构嵌套轮廓的整个层次 #method:轮廓逼近方法,cv2.CHAIN_APPROX_SIMPLE:压缩水平的,垂直的和斜的部分,也就是,函数只保留他们的终点部分, cv2. CHAIN_APPROX_NONE:也是一种方法,保留轮廓边框 binary,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE) #前面几个都为返回值,binary是二值的结果,contours为一些轮廓点 #绘制轮廓 draw_img = img.copy() res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2) cv_show(res,'res') # 需要copy一下,如果不copy的话原图像会被修改,其中contours是binary,contours,hierarchy中的返回值,-1代表将所有的轮廓都画出来,(0,0,255)代表用红色的线画轮廓,2指的是画轮廓的线的粗细。 #轮廓特征 cnt = contours[0] #先把轮廓拿出来 #面积 cv2.contourArea(cnt) #周长,True表示闭合的 cv2.arcLength(cnt,True) #绘制边界矩形 先将图像读入,灰度化,二值化,轮廓检测,然后 cnt = contours[2] #将轮廓拿出来 x,y,w,h = cv2.boundingRect(cnt) img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) cv_show(img,'img') # 模板匹配 首先,将两张图像读进来,一张是模板,一张是匹配图,然后灰度化,然后 res = cv2.matchTemplate(img,template,cv2.TM_SQDIFF) #匹配 img是原图,template是模板,cv2.TM_SQDIFF是匹配的方式 #有很多匹配的方式 1 TM_SQDIFF计算出来值越小越相关 2 TM_SQDIFF_NORMED:计算归一化平方不同,计算出来值越接近0越相关 3 TM_CCORR_NORMED:计算归一相关性 ,值越接近1越相关 #尽量使用归一化的结果 然后用 min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res) #计算出相似度最接近1和0的点,然后通过min_loc或者max_loc将相似度最高的点定位出来 , 取最大还是最小的点看我们用的什么匹配方法 #角点检测 cv2.cornerHarris(img,blockSize,ksize,k) # img:数据类型为float32的输入图像,如果不是可以用gray = np.float32(gray) # blockSize:角点检测中指定区域的大小 # ksize: Sobel求导中使用的窗口的大小 # K:取值参数为[0.04,0.06] 一般默认为0.04 #示例:dst = cv2.cornerHarris(gray,2,3,0.04) #将角点标记出来 img[dst>0.01*dst.max()] = [0,0,255] #这就是给图像dst标记角点 0.01随实际情况改,[0,0,255]表示用红色标记
最新回复(0)