python-opencv 中EPF,图像二值化和Canny边缘提取

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、边缘保留滤波(EPF)

高斯模糊只考虑了权重,只考虑了像素空间的分布,没有考虑像素值和另一个像素值之间差异的问题,如果像素间差异较大的情况下(比如图像的边缘),高斯模糊会进行处理,但是我们不需要处理边缘,要进行的操作就叫做边缘保留滤波(EPF)
代码如下(示例):

import cv2 as cv


def bi_demo(image):
    dst = cv.bilateralFilter(image, 0, 100, 15)    #100要大一点  15要小一点
    cv.imshow("bi_demo",dst)


def shift_demo(image): 
    dst = cv.pyrMeanShiftFiltering(image, 10, 50)  #均值迁移
    cv.imshow("shift_demo",dst)


src=cv.imread("D:\\12345.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
bi_demo(src)
cv.waitKey(0)

cv.destroyAllWindows()

二、图像二值化

图像的二值化处理就是讲图像上的点的灰度置为0或255,也就是讲整个图像呈现出明显的黑白效果。即将256个亮度等级的灰度图像通过适当的阀值选取而获得仍然可以反映图像整体和局部特征的二值化图像。在数字图像处理中,二值图像占有非常重要的地位,特别是在实用的图像处理中,以二值图像处理实现而构成的系统是很多的,要进行二值图像的处理与分析,首先要把灰度图像二值化,得到二值化图像,这样子有利于再对图像做进一步处理时,图像的集合性质只与像素值为0或255的点的位置有关,不再涉及像素的多级值,使处理变得简单,而且数据的处理和压缩量小。为了得到理想的二值图像,一般采用封闭、连通的边界定义不交叠的区域。所有灰度大于或等于阀值的像素被判定为属于特定物体,其灰度值为255表示,否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。如果某特定物体在内部有均匀一致的灰度值,并且其处在一个具有其他等级灰度值的均匀背景下,使用阀值法就可以得到比较的分割效果。如果物体同背景的差别表现不在灰度值上(比如纹理不同),可以将这个差别特征转换为灰度的差别,然后利用阀值选取技术来分割该图像。动态调节阀值实现图像的二值化可动态观察其分割图像的具体结果。

1.全局阙值

代码如下(示例):

import cv2 as cv
import numpy as  np


def threshold_demo(image): # 全局阈值
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) #将图像变为灰路图像
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU) #自动寻找阈值,
    #ret, binary = cv.threshold(gray, 127, 255, cv.THRESH_BINARY )  #自定义阈值 , 自定义阙值要把 |后面删除
    print("threshold value %s"%ret) #输出阈值
    cv.imshow("binary",binary)
    src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
threshold_demo(src)
cv.waitKey(0)

cv.destroyAllWindows()

2.局部阙值

代码如下(示例):

import cv2 as cv
import numpy as  np


def local_threshold(image): # 局部阈值
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    binary = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10) # 25的位置必须是奇数 2510可以改变
    cv.imshow("binary",binary)
    src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
local_threshold(src)
cv.waitKey(0)

cv.destroyAllWindows()

3.自定义阙值

import cv2 as cv
import numpy as  np


def custom_threshold(image):  #自定义阙值
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    h, w = gray.shape[:2]
    m = np.reshape(gray,[1, w+h])
    mean = m.sum() / (w+h)
    print("maen : ",mean)
    ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY)
    cv.imshow("binary",binary)


src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
custom_threshold(src)
cv.waitKey(0)

cv.destroyAllWindows()

三、Canny边缘提取

import cv2 as cv
import numpy as np


def edge_demo(image):
    blurred = cv.GaussianBlur(image, (3, 3), 0)  # 高斯模糊
    gray = cv.cvtColor(blurred,cv.COLOR_BGR2GRAY)  # 灰路图像
    xgrad = cv.Sobel(gray, cv.CV_16SC1, 1, 0)  # xGrodient
    ygrad = cv.Sobel(gray, cv.CV_16SC1, 0, 1)  # yGrodient
    edge_output = cv.Canny(xgrad, ygrad, 50, 150)  # edge
    cv.imshow("Canny Edge",edge_output)

    #  彩色边缘
    dst = cv.bitwise_and(image, image, mask=edge_output)
    cv.imshow("Color Edge", dst)


src=cv.imread("D:\\123qwe.png")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
edge_demo(src)
cv.waitKey(0)


cv.destroyAllWindows()


总结

以上就是今天所学的内容。
鸣谢
https://blog.csdn.net/u012308586/article/details/92795767
https://blog.csdn.net/qq_36783848/article/details/88553617

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值