Max-Min Filter 实现及用于检测图像边缘

一. 边缘检测

边缘检测通常作用于灰度图像上。边缘检测用于检测图像中的线。

边缘检测结果 ↑



二. 最大 - 最小滤波器(Max - Min)

3*3 Max-Min Filter 算法原理 ↑

我们知道,图像的细节属于低频信息,图像的边缘属于高频信息。我们使用一定大小的 Max-Min 滤波器作用于图像,当滤波器作用于图像细节时,输出结果往往趋向于0(黑色);而滤波器作用于图像边缘时,Max-Min 输出结果往往趋向于255(白色)。所以 最大-最小滤波器 能有效地用于检测图像的边缘和轮廓。



三. python实现 最大-最小 滤波器

用3*3的 Max-Min 滤波器对图像进行边缘检测

import cv2

import numpy as np

# BGR to Gray scale

def BGR2GRAY(img):

    b = img[:, :, 0].copy()

    g = img[:, :, 1].copy()

    r = img[:, :, 2].copy()

    # Gray scale

    out = 0.2126 * r + 0.7152 * g + 0.0722 * b

    out = out.astype(np.uint8)

    return out

# max-min filter

def max_min_filter(img, K_size=3):

    H, W = img.shape

    # Zero padding

    pad = K_size // 2

    out = np.zeros((H + pad * 2, W + pad * 2), dtype=np.float)

    out[pad: pad + H, pad: pad + W] = gray.copy().astype(np.float)

    tmp = out.copy()

    # filtering

    for y in range(H):

        for x in range(W):

        # core code

            out[pad + y, pad + x] = np.max(tmp[y: y + K_size, x: x + K_size]) -
                np.min(tmp[y: y + K_size, x: x + K_size])

    out = out[pad: pad + H, pad: pad + W].astype(np.uint8)

    return out

# Read image

img = cv2.imread("../paojie.jpg").astype(np.float)

# get grayscale

gray = BGR2GRAY(img)

# Max-Min filtering

out = max_min_filter(gray, K_size=3)

# Save result

cv2.imwrite("out.jpg", out)

cv2.imshow("result", out)

cv2.waitKey(0)

cv2.destroyAllWindows()


四. 实验结果:

边缘检测结果 ↑

原图 ↑



五. 参考内容:

  https://www.jianshu.com/p/fea3b4d741ab

原文地址:https://www.cnblogs.com/wojianxin/p/12502812.html

时间: 2024-10-12 21:26:24

Max-Min Filter 实现及用于检测图像边缘的相关文章

opencv 检测图像边缘 Canny算法应用

图解边缘检测 opencv 应用Canny算法进行边缘检测 import cv2 as cv import numpy as np img = cv.imread('baby_g.jpg', 0) # 二值化图像处理后,边缘检测效果更好 _, thresh = cv.threshold(img, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU) # canny边缘检测,60以下置为0,180以上置为255,第2.3参数的作用可查看本文最后一部分内容 edges

图像边缘和轮廓特征的提取方法

Part1:先介绍几个关于图像处理的概念 1 图像锐化 图像锐化(image sharpening)是补偿图像的轮廓,增强图像的边缘及灰度跳变的部分,使图像变得清晰,分为空域处理和频域处理两类.图像锐化是为了突出图像上地物的边缘.轮廓,或某些线性目标要素的特征.这种滤波方法提高了地物边缘与周围像元之间的反差,因此也被称为边缘增强. 2图像平滑 概念 图像平滑是指用于突出图像的宽大区域.低频成分.主干部分或抑制图像噪声和干扰高频成分的图像处理方法,目的是使图像亮度平缓渐变,减小突变梯度,改善图像质

day05 协程函数,递归函数,匿名函数lambda,内置函数map reduce filter max min zip sorted,匿名函数lambda和内置函数结合使用,面向过程编程与函数编程,模块与包的使用,re模块内置函数

基础篇 本章大纲: 协程函数 递归函数 匿名函数lambda 内置函数map reduce filter  max min zip sorted 匿名函数lambda和内置函数结合使用 面向过程编程与函数编程 模块与包的使用 re模块内置函数 一,协程函数 注意:函数先定义,后使用.这是函数第一原则.函数主要分为定义,调用 1.1,什么是协程函数 协程函数特点:yield变为表达式,可以通过g.send(value)传值,用send传值时协程函数需要初始化,也可以说是生成器函数的一种 1.2,协

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的Perspective Trans

OpenCV2学习笔记(六):检测图像颜色小程序

设计一个界面,用来检测一幅图像的颜色分布,开发平台为Qt5.3.2+OpenCV2.4.9. 该程序的主要步骤如下: 1. 载入图像,选定一种颜色: 2. 设定阈值,在该值范围内判定像素属于预设的颜色: 3. 在界面的Label中输出结果. 首先,新建一个Qt Widgets Application,其中基类选择为QWidget,在创建完项目后,添加一个检测图像颜色的类ColorDetector.并在在Qt项目的.pro文件中添加: INCLUDEPATH+=C:\OpenCV\install\

SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum

SQL--合计函数(Aggregate functions):avg,count,first,last,max,min,sum avg() 函数 定义和用法 AVG 函数返回数值列的平均值.NULL 值不包括在计算中. SQL AVG() 语法 SELECT AVG(column_name) FROM table_name SQL AVG() 实例 我们拥有下面这个 "Orders" 表: O_Id OrderDate OrderPrice Customer 1 2008/12/29

python库skimage 将针对灰度图像的滤波器用于RGB图像 逐通道滤波;转换为HSV图像滤波

有许多滤波器设计用于灰度图像但是不能用于彩色图像.为了简化创建函数,使其能够用于RGB图像,scikit-image图像处理库提供了adapt_rgb装饰器. 实际使用adapt_rgb装饰器,你必须决定如何调整RGB图像以使灰度滤波器能够用于RGB图像.有两个预定义的处理方式: "每个通道": 传输RGB的每个通道给滤波器,处理后,将它们按照rgb顺序整合到RGB图像. "hsv_value": 转换RGB图像到HSV图像并传输明度通道的值给滤波器.滤波的结果被插

聚合函数:sum,avg,max,min,count;模糊查询;排序

----聚合函数 --做计算 做统计 对null过滤:null是指不知道什么值,所以无法做计算--sum(参数):统计和--avg(参数):求平均值--max(参数):最大值--min(参数):最小值--count(参数):获取满足条件的记录数--1.获取学员总人数select COUNT(Email) from Student--2.获取最大的年龄值 年龄值越大,年龄越小 年龄值越小,年龄越大select MAX(BornDate) from Studentselect min(BornDat

Python-Anaconda练习candy算子用于边缘提取,再用hough变换检测直线边缘

img: 待检测的图像. threshold: 阈值,可先项,默认为10 line_length: 检测的最短线条长度,默认为50 line_gap: 线条间的最大间隙.增大这个值可以合并破碎的线条.默认为10 返回: lines: 线条列表, 格式如((x0, y0), (x1, y0)),标明开始点和结束点. 下面,我们用canny算子提取边缘,然后检测哪些边缘是直线? import skimage.transform as st import matplotlib.pyplot as pl