python opencv 图像预处理1

  • 图像显示窗口
# 函数自带方法
cv2.namedWindow('img', cv2.WINDOW_NORMAL)    # 窗口大小可变
cv2.namedWindow('img', cv2.WINDOW_AUTOSIZE)    # 窗口大小不可以改变
cv2.namedWindow('img', cv2.WINDOW_FREERATIO)   # 窗口大小自适应比例
cv2.namedWindow('img', cv2.WINDOW_KEEPRATIO)   # 保持比例

# 自定义显示窗口大小

def imshow(img,height,width,title):
    cv2.namedWindow(title,0)   # 标志 0 不可省
    cv2.resizeWindow(title, width, height)  # 自定义窗口大小
    cv2.moveWindow(title,600,300) # 设置窗口在屏幕中位置
    cv2.imshow(title,img)
    cv2.waitKey(0)

  • 滤波
cv2.blur()  # 均值
cv2.guassian() # 高斯
cv2.median() # 中值
  • 二值化
ret,dstimg = cv2.threshold(src, thresh, maxval, type[, dst]) 

在这里插入图片描述

  • 边缘检测
cv2.canny(img,t1,t2)  # img可以为彩色图,灰度图和二值图;一般t1,t2分别先取:50,100
cv2.Sobel()
cv2.Scharr()
# 对于opencv中没有的现成调用函数,但可以通过定义卷积核,利用cv2.filter2D函数实习边缘检测。
def cv_Edge(img,kernelX, kernelY):
  # img: 原图像; kernelX、kernelY:X/Y方向的卷积核
  # 计算梯度
  x = cv2.filter2D(img, -1, kernelX) # 卷积运算
  y = cv2.filter2D(img, -1, kernelY) 

  # 调用convertScaleAbs()函数计算绝对值
  absX = cv2.convertScaleAbs(x)
  absY = cv2.convertScaleAbs(y)
  edgeImg= cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
  return edgeImg

cv2.canny参数详细测试参考

# 为了方便找到合适的双阈值,可以利用滑动条,实时显示不同参数的检测效果
    imgname = '60_standard.bmp'
    img = cv2.imread(datapath+imgname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    H,W = gray.shape
    pW = 600
    pH = int(pW * H / W)
    ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)

    plt.figure()
    plt.subplot(121)
    plt.imshow(img,'gray')
    plt.title('img')

    plt.subplot(122)
    plt.imshow(binary,'gray')
    plt.title('binary')

    plt.show()


    def nothing(x):  # 滑动条的回调函数
        pass
    WindowName = 'Clover'
    cv2.namedWindow(WindowName, 0)
    cv2.resizeWindow(WindowName, pW, pH)
    cv2.createTrackbar('minValue', WindowName, 0, 200, nothing)  # 创建滑动条
    cv2.createTrackbar('maxValue', WindowName, 0, 250, nothing)

    while (1):
        minValue = cv2.getTrackbarPos('minValue', WindowName)  # 获取滑动值
        maxValue = cv2.getTrackbarPos('maxValue', WindowName)

        canny = cv2.Canny(img,minValue,maxValue)

        cv2.imshow(WindowName,canny)

        k = cv2.waitKey(1) & 0xFF
        if k == 27:
            break

    cv2.destroyAllWindows()

在这里插入图片描述
在这里插入图片描述

  • 形态学处理
cv2.dilate(img, kernel, iteration) #kernel: 卷积核,默认3*3;iterations: 迭代次数,默认1   需要根据需要增强的对象特征,自定义卷积核,矩形 方形  圆形 十字架等
    imgname = '60_standard.bmp'
    img = cv2.imread(datapath+imgname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    H,W = gray.shape
    pW = 600
    pH = int(pW * H / W)
    ret, binary = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY)

    canny = cv2.Canny(img,100,200)

    kernel1 = np.ones(3,dtype=np.uint8)
    kernel2 = np.array([[1,0,1],[0,1,0],[1,0,1]], np.uint8)

    dilateimg1 = cv2.dilate(canny,kernel1,iterations=3)
    dilateimg2 = cv2.dilate(canny,kernel2,iterations=3)

    plt.figure()
    plt.subplot(121)
    plt.imshow(dilateimg1,'gray')
    plt.title('dilateimg1')

    plt.subplot(122)
    plt.imshow(dilateimg2,'gray')
    plt.title('dilateimg2')

    plt.show()

在这里插入图片描述
两个边缘线角度在±45°左右,所以设计kernel2为3*3的正反对角线为1,对角线的增强效果好于kernel1.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值