【数字图像处理系列五】图像滤波之空间滤波:图像平滑降噪和图像锐化

2023-11-18


· 本系列python版本:python3.5.4

· 本系列opencv-python版本:opencv-python3.4.2.17

· 本系列使用的开发环境是jupyter notebook,是一个python的交互式开发环境,测试十分方便,并集成了vim操作,安装教程可参考:windows上jupyter notebook主题背景、字体及扩展插件配置(集成vim环境)

前言:原创不易,转载请告知并注明出处!扫码关注公众号【机器学习与自然语言处理】,定期发布知识图谱,自然语言处理、机器学习等知识,添加微信号【17865190919】进讨论群,加好友时备注来自CSDN。
在这里插入图片描述


【数字图像处理系列三】图像增强:线性、 分段线性、 对数、 反对数、 幂律(伽马)变换、直方图均衡 一文中我们从图像灰度变换的角度阐述了图像增强的各种方式,本文我们将一起学习图像处理中重点的方式:图像滤波,图像滤波分为空间域滤波和频率域滤波,频率域滤波我们将在下一节重点说明。图像空间滤波对于图像处理主要体现在两个方面:

  1. 平滑图像,达到降低图像噪音的效果(平滑空间滤波)
  2. 锐化图像,主要目的是突出灰度的过渡部分,即突出图像的边缘(锐化空间滤波)

先上图,感受一下空间滤波对图像处理的效果(原图、经过拉普拉斯处理后的图像):
在这里插入图片描述
在这里插入图片描述




一、空间滤波原理


图像的空间滤波器有两大部分:

  1. 一个基于图像像素的矩形邻域
  2. 对矩形邻域包围的图像像素的操作方式

理解图像的矩形邻域如下图所示

将图像的左上角看做是空间域中的原点O,向下取为x轴,向右取为y轴,图中便显示了中心点(x,y)的一个3*3邻域。 每经过一个滤波产生一个新像素,新像素的坐标等于领域中心坐标(x,y),新像素的值是滤波操作的结果。而滤波器的类型也取决于邻域上操作的类型,如果邻域操作是线性操作,则滤波器称为线性空间滤波器;反之如果邻域操作是非线性操作,则滤波器称为非线性空间滤波器。

这里我们假设 f(x,y) 为原像素值,g(x,y) 为滤波后的像素值,则对于一个大小为M * N的图像使用大小为m * n的滤波器进行线性空间滤波,若令m=2a+1,n=2b+1,则邻域上线性操作可统一表达成下式:

其中x,y是可变的,以便w中的每个像素可访问f中的每个像素,我们一般称邻域内像素和滤波器模板的操作叫做卷积。下面将分别讲解平滑空间滤波器和锐化空间滤波器





二、平滑空间滤波器


1、均值滤波、加权均值滤波

均值滤波又称为线性空间滤波,利用邻域平均法,即用几个像素灰度的平均值来代替每个像素的灰度。有效抑制加性噪声,但容易引起图像模糊,尤其是会模糊图像边缘。通过下图便可看到均值滤波和加权均值滤波的区别:

其中左图是均值滤波,即邻域中每个像素权重相同,取邻域平均值作为中心像素点的滤波输出值,则滤波器模板计算公式为:

而右图滤波器模板则赋予中心点最高权重,然后随着距中心点距离的增加而减小系数值,其目的是在平滑处理中试图降低模糊,加权均值滤波器的操作如下是:


下面分别通过opencv-python提供的均值滤波和自定义均值滤波器两种方式实现图像的均值滤波:

import cv2
import copy
import random
import imutils
import numpy as np

img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/lena.png')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#利用opencv提供函数实现均值滤波
blur_img = cv2.blur(gray_img, (3, 3))

#在灰度图上手动实现均值滤波器
gray_avg_img = copy.deepcopy(gray_img)
for i in range(1, gray_img.shape[0]-1):
    for j in range(1, gray_img.shape[1]-1):
        sum_pix = sum([gray_img[l, k] for l in range(i-1, i+2) for k in range(j-1, j+2)])
        gray_avg_img [i, j] = int(sum_pix/9)

#在RGB彩色图上手动实现均值滤波器
rgb_avg_img = copy.deepcopy(img)
for i in range(1, img.shape[0]-1):
    for j in range(1, img.shape[1]-1):
        sum_b_pix = sum([img[l, k, 0] for l in range(i-1, i+2) for k in range(j-1, j+2)])
        sum_g_pix = sum([img[l, k, 1] for l in range(i-1, i+2) for k in range(j-1, j+2)])
        sum_r_pix = sum([img[l, k, 2] for l in range(i-1, i+2) for k in range(j-1, j+2)])
        rgb_avg_img [i, j] = [int(sum_b_pix/9), int(sum_g_pix/9), int(sum_r_pix/9)]

cv2.imshow('origin image', imutils.resize(img, 500))
cv2.imshow('gray image', imutils.resize(gray_img, 500))
cv2.imshow('blur image', imutils.resize(blur_img, 500))
cv2.imshow('gray average image', imutils.resize(gray_avg_img , 500))
cv2.imshow('rgb average  image', imutils.resize(rgb_avg_img , 500))
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()


效果图如下:依次是原图、灰度图、基于灰度图opencv提供函数blur均值滤波效果、基于灰度图自定义均值滤波效果、基于彩色图自定义均值滤波效果

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




2、中值滤波

中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性平滑滤波信号处理技术。中值滤波的特点即是首先确定一个以某个像素为中心点的邻域,然后将邻域中各像素的灰度值排序,取其中间值作为中心像素灰度的新值。中值滤波在对于椒盐噪音处理上效果很好



下面分别通过opencv-python提供的中值滤波和自定义中值滤波器两种方式实现图像的中值滤波,下面实验中我们尝试着对图像添加椒盐噪音然后进行使用中值滤波进行消除:

import cv2
import copy
import random
import imutils
import numpy as np

img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/old.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#给灰度图像自动添加椒盐噪音
pepper_img = copy.deepcopy(gray_img)
for i in range(gray_img.shape[0]):
    for j in range(gray_img.shape[1]):
        if random.randint(0, 20) == 0:
            pix = random.randint(250, 255)
            pepper_img[i, j] = pix

#opencv提供cv2.medianBlur()函数实现中值滤波
blur_img = cv2.medianBlur(pepper_img, 5)

#自实现中值滤波器
temp_arr = np.zeros((9))
median_img = copy.deepcopy(pepper_img)
for i in range(1, pepper_img.shape[0]-1):
    for j in range(1, pepper_img.shape[1]-1):
        temp_arr[0] = pepper_img[i-1, j-1]
        temp_arr[1] = pepper_img[i-1, j]
        temp_arr[2] = pepper_img[i-1, j+1]
        temp_arr[3] = pepper_img[i, j-1]
        temp_arr[4] = pepper_img[i, j]
        temp_arr[5] = pepper_img[i, j+1]
        temp_arr[6] = pepper_img[i+1, j-1]
        temp_arr[7] = pepper_img[i+1, j]
        temp_arr[8] = pepper_img[i+1, j+1]
        arr = np.sort(temp_arr)
        median_img[i, j] = arr[4]

cv2.imshow('pepper image', imutils.resize(pepper_img, 600))
cv2.imshow('blur image', imutils.resize(blur_img, 600))
cv2.imshow('median image', imutils.resize(median_img, 600))
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()


效果图如下:依次是含椒盐噪音图、经过cv2.medianBlur()函数处理后的图像、经过自定义中值滤波器滤波后图像

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



除了中值滤波外,还有一种非线性滤波是最值滤波,最值滤波是去邻域中的最大值最为新像素值,在搜寻一幅图像最亮点时非常有用。





三、锐化空间滤波器


写在前面上节提到的图像平滑是通过模糊图像达到图像降噪的目的,但同时存在一个问题就是会使得图像的边缘被淡化。因此本节图像锐化滤波恰相反,图像平滑是一个积分的过程,图像锐化便是通过图像微分增强边缘和其他突变,削弱灰度变换缓慢的区域。

在图像微分锐化操作中,对于一阶微分的任何定义需要保证以下三点:

  1. 在恒定灰度区域的微分值为零
  2. 在灰度台阶或斜坡处微分值非零
  3. 沿着斜坡的微分值非零

同样类比得对于二阶微分的任何保证以下三点:

  1. 在恒定区域微分值为零
  2. 在灰度台阶或斜坡的起点处微分值非零
  3. 沿着斜坡的微分值非零

1、二阶微分图像锐化—laplacian算子

首先一个二维图像函数 f(x,y) 的拉普拉斯算子定义为:

拉普拉斯变换是一个线性算子,在x方向上离散化有:

在y方向离散化有:

从上面三个式子可以得出离散拉普拉斯算子是:

上面公式便是拉普拉斯算子中一种计算方式,等价于下图中的laplacian模板1,自然laplacian模板2也可以类比写出离散算子公式:


注:由于拉普拉斯是一种微分算子,因此其强调的是图像中灰度的变换,忽视图像灰度变换缓慢的区域。因此我们通过laplacian算子得出的是图像更多的是边缘线,因此,我们可以将原图和拉普拉斯图像叠加在一起,可以复原背景特性并且保持拉普拉斯锐化处理的效果,由此得出下面公式:

对于上面展示的拉普拉斯模板1和拉普拉斯模板2,常数c取-1,也有其他模板,这里不再详述


下面给出利用opencv函数和自实现上述拉普拉斯模板的应用实例:

import cv2
import copy
import random
import imutils
import numpy as np

img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/blurry_moon.jpg')

#手动实现拉普拉斯滤波,使用上述laplacian模板1
lap_img1 = copy.deepcopy(img)
for i in range(1, img.shape[0]-1):
    for j in range(1, img.shape[1]-1):
        temp = img[i+1, j] + img[i-1, j] + img[i, j+1] + img[i, j-1] -4*img[i, j]
        lap_img1[i, j] = img[i, j] - temp

#手动实现拉普拉斯滤波,使用上述laplacian模板2
lap_img2 = copy.deepcopy(img)
for i in range(1, img.shape[0]-1):
    for j in range(1, img.shape[1]-1):
        temp = img[i-1, j-1] + img[i-1, j] + img[i-1, j+1] + img[i, j-1] + \
                img[i, j+1] + img[i+1, j-1] + img[i+1, j] + img[i+1, j+1] - 8*img[i, j]
        lap_img2[i, j] = img[i, j] - temp

#使用opencv自带函数实现,使用上述laplacian模板1
kernel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) #定义了卷积核,对每一个像素进行操作
lapkernel_img = cv2.filter2D(img, -1, kernel)
lap_img3 = img - lapkernel_img

cv2.imshow('origin image', imutils.resize(img, 400))
cv2.imshow('laplacian image1', imutils.resize(lap_img1, 400))
cv2.imshow('laplacian image2', imutils.resize(lap_img2, 400))
cv2.imshow('laplacian image3', imutils.resize(lap_img3, 400))
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()


效果图如下,顺序既是上述程序的输出顺序:

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




2、非锐化掩蔽

非锐化掩蔽的思路便是应原图像减去平滑的图像,这样便得到强调边缘的图像,然后再和原图像相加,便达到强调图像边缘的效果,具体步骤如下:

  1. 模糊原图像
  2. 从原图像减去模糊图像(产生的差值图像称为模板)
  3. 将模板和原图像相加

则将上述思路换算成数学公式便是:

然后在原图像加上模板的一个权重部分:

k>1时我们称该处理为高提升滤波,当k<1时则是不强调非锐化模板的作用

下面提供代码实现如下:

import cv2
import copy
import random
import imutils
import numpy as np

img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/blurry_moon.jpg')
blur_img = cv2.blur(img, (5, 5))

mask_img = img - blur_img
sharp_mask_img = img + mask_img

cv2.imshow('origin image', imutils.resize(img, 400))
cv2.imshow('blur image', imutils.resize(blur_img, 400))
cv2.imshow('mask image', imutils.resize(mask_img, 400))
cv2.imshow('sharpen mask image', imutils.resize(sharp_mask_img, 400))
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()



3、cv2.filter2D()自定义卷积核滤波

opencv-python中提供cv2.filter2D()函数可实现自定义内核和图像进行卷积操作,cv2.filter2D()一般定义为:

cv2.filter2D(img, -1, kernel)   #参数三kernel是卷积核; 参数二ddepth输入值为-1时,目标图像和原图像深度保持一致

下面我们提供实例展示对图像滤波的效果:

import cv2
import copy
import random
import imutils
import numpy as np

img = cv2.imread('E:/peking_rw/ocr_project/base_prehandle/img/old.jpg')
kernel = np.array([[0, -1, 0], [0, 5, 0], [0, -1, 0]]) #自定义了卷积核,对每一个像素进行操作
new_img = cv2.filter2D(img, -1, kernel)

cv2.imshow('origin image', imutils.resize(img, 400))
cv2.imshow('new image', imutils.resize(new_img, 400))
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

根据自定义的卷积核 kernel = np.array([[0, -1, 0], [0, 5, 0], [0, -1, 0]]) 得到的滤波效果如下:

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【数字图像处理系列五】图像滤波之空间滤波:图像平滑降噪和图像锐化 的相关文章

  • 基于Python3的接口自动化总结(一)——文件上传接口

    文件上传接口 api POST http host api import 接口入参 file 文件内容 import os import urllib3 import ast def import by rest self file pat
  • 原码,补码,反码的应用

    原码 补码 反码的应用 计算机专业的同学应该知道 课本中对原码反码补码的介绍大致是这样的几句话 正数 正数的原码是他的本身 正数的反码还是等于原码 正数的补码等于他的原码 负数 负数的原码等于该数值的二进制 最高位表示符号位 正数取0 负数
  • 微众银行马智涛:解放数据生产力,以金融科技助力数字经济发展|数字思考者50人...

    钛媒体2022特别专题策划 数字思考者50人 探访中国50位独具代表的数字化思考者 我们理解的 TechThinker 涵盖了中国数字化浪潮中的技术践行者 政策制定者与投资决策者 在这场长达10年的乘风破浪中 我们每个人都在分享技术进步的果
  • docker原理详解

    一 docker简介 docker是一个虚拟环境容器 可以将你的开发环境 代码 配置文件等一并打包到这个容器中 并发布和应用到任意平台中 docker容器和虚拟机都有虚拟隔离的特性 所以一般都会拿虚拟机和docker容器作比较 二 dock
  • C++数据结构 矩阵的转置、镜像及旋转

    C 数据结构 矩阵的转置 镜像及旋转 矩阵介绍 C 中的矩阵是一种二维数组 用于存储数值数据 矩阵可以用于存储图像数据 以及科学和工程计算中的数据 常用于以下场景 数学运算 矩阵乘法 行列式计算 特征值分解等 图像处理 图像缩放 旋转 颜色
  • facebook 审请AppID、AppSecret注意问题

    facebook https developers facebook com https developers facebook com apps 1596024967362217 dashboard 账号 密码 步骤 1 填入应用的包名
  • 文件夹上传到云服务器,文件夹怎么上传到云服务器上

    文件夹怎么上传到云服务器上 内容精选 换一换 RedisShake是一款开源的Redis迁移工具 支持Cluster集群的在线迁移与离线迁移 备份文件导入 但是部署在其他云厂商Redis服务上的Cluster集群数据 由于SYNC PSYN
  • MBR、GPT、LVM分区

    GPT分区 支持大于2T的空间分区UEFI系统 支持128个主分区 parted mklabel New disk label type gpt parted mkpart Partition name vdb1 File system t
  • 搭建zookeeper集群的时候报: JAVA_HOME is not set and java could not be found in PATH.错误

    我在搭建zookeeper集群的时候总是报 JAVA HOME is not set and java could not be found in PATH 的错误 但是我的java环境是没问题的 这个问题困扰我两天了 终于解决了 在此记录
  • 知道这20个正则表达式,能让你少写1,000行代码

    正则表达式 一个十分古老而又强大的文本处理工具 仅仅用一段非常简短的表达式语句 便能够快速实现一个非常复杂的业务逻辑 熟练地掌握正则表达式的话 能够使你的开发效率得到极大的提升 正则表达式经常被用于字段或任意字符串的校验 如下面这段校验基本
  • springcloud微服务系列教程(一) 什么是微服务?为什么要用springcloud?

    前言 这两年 微服务 一词被传得很火 关于微服务的文章在各大技术论坛和博客不断的兴起 不断被转发和评论 技术人员之间的交流也越来越多的青睐微服务这一话题 仿佛不懂微服务就不是一个合格的技术开发者 就连有些公司招聘的要求上都要求应聘者必须掌握
  • Hspice获取节点电流的方法

    如果mos调用时语句为 MNM1 则端口电流输出为 i1 x1 MNM1 表示输出子电路x1里面Device MNM1的第一个节点电流 如果调用语句为 XNM1 用于subckt模型Device的电流输出 则端口电流输出为 isub x1
  • Unity的Text Mesh Pro文字显示重叠处理

    在使用Text Mesh Pro的时候 出现文字重叠 如图 在编辑器内显示是正确的 最后发现是换行造成的 原本的文字是从pdf中复制过来 就会重叠 在记事本中删除换行用回车再次换行就能正确显示
  • CCS5.2.1/5.5 错误-No source available for main()

    1 错误现象 在CCS5 2 1开发环境中从别处导入项目并编译完成后 下载程序时出现如下图所示错误 备注 当前使用的compiler版本为C6000v7 4 14 2 解决办法 进入项目属性设置页面 可以看到当前的调试模式为 Suppres
  • 详解PyCharm配置Anaconda的艰难心路历程

    本文来源于公众号 csdn2299 喜欢可以关注公众号 程序员学府 这篇文章主要介绍了详解PyCharm配置Anaconda的艰难心路历程 小编觉得挺不错的 现在分享给大家 也给大家做个参考 一起跟随小编过来看看吧 在安装好pycharm后
  • 基于JAVA+SpringBoot+VUE的心理健康测试系统的设计与实现

    全网粉丝20W csdn特邀作者 博客专家 CSDN新星计划导师 java领域优质创作者 博客之星 掘金 华为云 阿里云 InfoQ等平台优质作者 专注于Java技术领域和毕业项目实战 文末获取项目下载方式 一 项目背景介绍 随着现代社会的
  • Redis常用的5种数据类型底层结构是怎样构成的

    前言 Redis是一个基于内存中的数据结构存储系统 可以用作数据库 缓存和消息中间件 Redis支持五种常见对象类型 字符串 String 哈希 Hash 列表 List 集合 Set 以及有序集合 Zset 我们在日常工作中也会经常使用它
  • 架构师成长之路

    延迟队列实现 基于监听key过期实现的延迟队列实现 这里需要继承KeyspaceEventMessageListener类来实现监听redis键过期 public class KeyExpirationEventMessageListene

随机推荐

  • Java CGLIB动态代理示例

    1 CGLIB动态代理简介 JDK动态代理是利用反射机制生成一个实现代理接口的匿名类 在调用具体方法前调用InvokeHandler来处理 而cglib动态代理是利用asm开源包 对代理对象类的class文件加载进来 通过修改其字节码生成子
  • pandas基础用法详解

    pandas基础用法详解 本文旨在总结pandas的基础用法 越用越发感觉基础的重要性 复杂和高级只是基础的衍生 扎实的基础和深刻的理解能帮助我们更快的弄懂复杂的东西 基础的熟悉的也就就能轻松发挥了 pandas是什么 Pandas 是一个
  • rabbitmq的DefaultConsumer使用和不同交换机模式的代码示例

    Defaultconsumer public class Consumer public static void main String args throws IOException TimeoutException 获取TCP长连接 C
  • 基于状态机的单个按键长按,短按实现复用

    开博第一文 希望再次记录学习的过程 按键扫描 单片机里面再基础不过的程序了 但对于初学者来说 用好按键也不是一件简单的事情 在毛老师的介绍下 第一次知道了状态机的思想也可以用于单片机的程序设计 感觉很是新奇 看了老师给发的几个文档后对状态机
  • 毕业设计 嵌入式 MP3音乐播放器设计与实现

    文章目录 1 简介 2 绪论 2 1 课题背景与目的 3 系统设计 3 1 系统架构 3 2 软件部分设计 3 3 实现效果 3 4 部分相关代码 4 最后 1 简介 Hi 大家好 学长今天向大家介绍一个 单片机项目 基于单片机的MP3音乐
  • 数据结构---HashSet存值和取值

    HashSet存值和取值 存 取 HashMap实现了Map接口 而HashSet实现了Set接口 HashMap用于存储键值对 而HashSet用于存储对象 HashMap不允许有重复的键 可以允许有重复的值 HashSet不允许有重复元
  • 【一千个论文合集】计算机科学的26个细分领域近年必读论文集合

    文章目录 1 机器学习 2 计算机视觉 3 自然语言处理 4 数据挖掘 5 机器人 6 知识工程 7 模式识别 8 信息检索与推荐 9 数据库 10 人机交互 11 计算机图形学 12 多媒体 13 可视化 14 数据科学 15 安全与隐私
  • vue利用 sortable 完成表格拖拽

    先讲一下vue2 使用sortable完成表格拖拽 不只是表格 div也可以实现 但我项目中是表格拖拽 github地址 安装 npm install sortablejs save 使用 我的项目中是拖拽一个小按钮移动 而不是整行
  • umi:配置式路由

    场景描述 很多时候 我们需要做到简单的路由拦截 比如用户未登录的时候 我们需要跳转到登录页面 等到用户登录后在重新跳转到之前的页面 而很多情况下这些是约定式路由无法完成的 就需要我们配置式路由 论述 umi自带的约定式路由 可以自动的生成路
  • element-ui的table表格实现跨页多选及回显效果

    效果图 安装 Element ui 和 egrid 基于 Element UI Table 组件封装的高阶表格组件 可无缝支持 element 的 table 组件 npm i element ui S npm i egrid S 引入 E
  • kubectl常用命令

    alias k kubectl alias kc k create f alias kgp k get pods alias kdp k describe pods alias kdep k delete pods alias kl k l
  • mysql 判断字符串相等_「8」掌握MySQL比较运算符是很有必要的

    本文要的主题就是MySQL比较运算符 也就是通过各类案例来看看其运行得到的结果是什么 以及掌握其规则 首先 我们看看比较运算符有哪些种类 接下来我们就通过案例的案例的方式来逐一学习 1 等于运算符 是用来判断数字 字符串和表达式是否相等 如
  • 面向对象编程中composition、aggregation、association的区别

    在面向对象程序设计中 对象的关系主要有三种 composition aggregation association composition 组合 复合 对象x的生命期由唯一拥有者owner控制 owner析构时会把x同步析构 例如Engin
  • uni-app css尺寸单位rpx介绍

    一 前言 1 在使用uni app开发小程序时支持的尺寸单位如下 1 基础单位 px rpx 2 h5单位 rem vm vh 2 rpx是微信小程序提出的一种响应式px 二 rpx介绍 1 现实情况下 ui设计师只提供一个分辨率的图 严格
  • css层叠样式表——css基础介绍

    css层叠样式表第一天 css层叠样式表01 css层叠样式表第一天 css介绍 css语法 html标签全局属性 引入css样式的方式 知识点应用 css介绍 css是Cascading Style Sheet的缩写 中文 层叠样式表 是
  • M1 Pro 安卓模拟器+Xposed环境

    吐槽 最近换了台mac 发现mac对程序员真的太友好了 一些环境配置起来很方便 借助brew几乎都是一行命令的事 但是有一些环境还不是那么好配 在这做一下记录 这次要说的是安卓模拟器 我本人是有一台Google Pixel真机的 插上数据线
  • Python-Tensorflow猫狗数据集分类,96%的准确率

    import tensorflow as tf from tensorflow import keras from tensorflow keras import layers curl O https download microsoft
  • 多环境配置

    Mybatis plus 需要添加一个依赖 这个是baomidou官方的动态数据源包
  • 机器学习 | 图像检索开源项目合集

    1 Trace moe 图像反向搜索动漫场景 使用动漫截图搜索该场景的拍摄地 它告诉你该动画在日本动漫中出现的是哪个动画 哪个情节以及确切的时间 https github com soruly trace moe 2 Awesome Cbi
  • 【数字图像处理系列五】图像滤波之空间滤波:图像平滑降噪和图像锐化

    本系列python版本 python3 5 4 本系列opencv python版本 opencv python3 4 2 17 本系列使用的开发环境是jupyter notebook 是一个python的交互式开发环境 测试十分方便 并集