2020-09-05

图片预处理

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]表示用红色标记



  





©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页