概述

本文主要讲述的是数字图像处理中对图像背景的处理以及图片噪点的去除,运用到的方法有高斯模糊、灰度二值化、连通域检检测

1.算法原理

高斯模糊

引用Wikipedia的两句话:

Mathematically, applying a Gaussian blur to an image is the same as convolving the image with a Gaussian function.

数学上讲,对图像做高斯模糊等同于将图像与高斯函数卷积。

Since the Fourier transform of a Gaussian is another Gaussian, applying a Gaussian blur has the effect of reducing the image’s high-frequency components; a Gaussian blur is thus a low pass filter.

由于高斯分布的傅里叶变换仍然是高斯分布,使用高斯模糊就减少了图像的高频分量,因此高斯模糊是低通滤波器。

关于高斯模糊的原理可以参考:高斯模糊原理

使用openCV只需要一行代码即可以实现高斯模糊:

blur = cv2.GaussianBlur(img,(5,5),0)

这里(5, 5)表示高斯矩阵的长与宽都是5,标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。概括地讲,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。

灰度二值化

先解释一下灰度:

灰度是指只含亮度信息,不含色彩信息的图像。黑白照片就是灰度图,特点是亮度由暗到明,变化是连续的

用个例子来说明吧:一个256级灰度的图象,如果RGB三个量相同时,如:RGB(100,100,100)就代表灰度为100,RGB(50,50,50)代表灰度为50。

原理参考:图像灰度化

在OpenCV中的用法:

gray = cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY)

再解释一下二值化:

图像的二值化是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。

原理说起来很简单,就是灰度大于 阈值(Threshold) 的时候将灰度值设为255,小于则设为0,当然还有很多其他的二值化方法,参考博客:几种不同的Threshold类型

在OpenCV中的用法:

ret,im_treshold = cv2.threshold(gray,Threshold,maxval,cv2.THRESH_BINARY)

threshold参数表示阈值。

maxval参数表示与THRESH_BINARY和HRESH_BINARY_INV阈值类型一起使用设置的最大值。

canny

1.Canny边缘检测算子是John F. Canny于 1986 年开发出来的一个多级边缘检测算法。

2.Canny 的目标是找到一个最优的边缘检测算法,最优边缘检测的含义是:

好的检测- 算法能够尽可能多地标识出图像中的实际边缘。

好的定位- 标识出的边缘要尽可能与实际图像中的实际边缘尽可能接近。

最小响应- 图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

3.算法步骤:

①高斯模糊 - GaussianBlur

②灰度转换 - cvtColor

③计算梯度 – Sobel/Scharr

④非最大信号抑制

⑤高低阈值输出二值图像

重要的是需要理解,高斯卷积核大小的选择将影响Canny检测器的性能。尺寸越大,检测器对噪声的敏感度越低,但是边缘检测的定位误差也将略有增加。一般5x5是一个比较不错的trade off。

推荐博客(写的很好):边缘检测Canny原理

在OpenCV中的用法:

canny1 = cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])

第一个中括号中的可以省略,具体这里为什么会有两个Threshold看推荐博客中的原理。

连通域检测

本文使用的是cv2.connectedComponentsWithStats()进行连通域检测的,具体的原理有篇博客写的很好:连通域检测原理,在这里就不赘述了,简单来说一般用两种方法可以实现:1)Two-pass;2)Seed-Filling种子填充。

要知道的有两种连通方式:

4连通

8连通

还需要注意的是cv2.connectedComponentsWithStats()的返回值,在这里给出官方文档。

input 8-bit single-channel (binary)

OutputArray labels, // output label map

OutputArray stats, // Nx5 matrix (CV_32S) of statistics:

// [x0, y0, width0, height0, area0;

// … ; x(N-1), y(N-1), width(N-1),

// height(N-1), area(N-1)]

OutputArray centroids, // Nx2 CV_64F matrix of centroids

要注意的是:stats一共有五位,分别对应各个轮廓的x,y,width,height和面积。注意0的区域标识的是background

2.实践过程

先推荐个好东西,当许多参数不确定的时候,可以用这两个函数:

cv2.createTrackbar('THRESHOLD','image',0,255,callback)

THRESHOLD = cv2.getTrackbarPos('THRESHOLD','image')

因为不同的图片各个参数往往不同,这样方便测试最优参数,当然不要忘记先cv2.namedWindow('image')创建一个窗口。

首先我测试的是cv2.GaussianBlur()中的blockSize和c

然后测试的是cv2.threshold()中的阈值以及cv2.adaptiveThreshold()中的blockSize和c

最好效果为:

treshold.jpg

adThreshold.jpg

可以发现已经去除掉了图片背景中的沁墨,仅剩下少部分噪点。

然后通过cv2.Canny()得到的图(用的普通的theshold):

通过连通域检测的结果去除少数几个噪点

_, labels, stats, centroids = cv2.connectedComponentsWithStats(canny1)

for istat in stats:

if istat[4]<18:

cv2.rectangle(im_treshold,tuple(istat[0:2]),tuple(istat[0:2]+istat[2:4]) , (255,255,255),thickness=-1)

cv2.rectangle(canny1,tuple(istat[0:2]),tuple(istat[0:2]+istat[2:4]) , 0,thickness=-1)

就得到最后的结果啦:

3.代码和结果

代码因为测试缘故,迭代了好几个版本,这里不删掉注释是为了方便你们调试:

import cv2

from matplotlib import pyplot as plt

#from skimage import measure, color, morphology

def callback(object):

pass

pic = cv2.imread('original.jpg')

#cv2.namedWindow('image')

gray1 = cv2.cvtColor(pic,cv2.COLOR_BGR2GRAY)

gray = cv2.GaussianBlur(gray1, (5,5), 0)

cv2.imwrite('gray.jpg',gray)

#cv2.createTrackbar('THRESHOLD','image',0,255,callback)

#cv2.createTrackbar('blockSize','image',3,11,callback)

#cv2.createTrackbar('c','image',1,10,callback)

#while(True):

#cv2.imshow('gray',gray)

#THRESHOLD = cv2.getTrackbarPos('THRESHOLD','image')

#blockSize = cv2.getTrackbarPos('blockSize','image')

#c = cv2.getTrackbarPos('c','image')

#THRESHOLD = 135

#if blockSize % 2 == 1:

#gray = cv2.GaussianBlur(gray1, (blockSize,blockSize), c)

ret,im_treshold = cv2.threshold(gray,135,255,cv2.THRESH_BINARY)

cv2.imwrite('treshold.jpg',im_treshold)

#if blockSize % 2 == 1:

#测试得出c=8,blockSize=5效果最好

im_at_mean = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C , cv2.THRESH_BINARY, 5, 8)

cv2.imwrite('adThreshold.jpg',im_at_mean)

canny1=cv2.Canny(im_treshold,100,200)

cv2.imwrite('canny.jpg',canny1)

#cv2.imshow('canny',canny1)

#stats:一共有五位,分别对应各个轮廓的x,y,width,height和面积。注意0的区域标识的是background

_, labels, stats, centroids = cv2.connectedComponentsWithStats(canny1)

#if cv2.waitKey(10) & 0xFF == ord('q'):

#break

for istat in stats:

if istat[4]<18:

cv2.rectangle(im_treshold,tuple(istat[0:2]),tuple(istat[0:2]+istat[2:4]) , (255,255,255),thickness=-1)

cv2.rectangle(canny1,tuple(istat[0:2]),tuple(istat[0:2]+istat[2:4]) , 0,thickness=-1)

#cv2.imshow('THRESHOLD',im_treshold)

cv2.imshow('result',im_treshold)

cv2.imwrite('cv_gray_result.jpg',im_treshold)

#label_img = measure.label(im_at_mean)

#label_img = morphology.remove_small_objects(label_img,min_size=3000,connectivity=1,in_place=True)

#dst = color.label2rgb(label_img)

#cv2.imshow('remove_small_objects',dst)

cv2.waitKey(0)

cv2.destroyAllWindows()

边缘检测后去除噪点_图片背景处理与噪点去除相关推荐

  1. CV小白成长记之一:去除图片背景印记及噪点

    问题描述(一): 运用图像处理的方法去除上图中背景黑色字印记. 问题的分析与解决(一): 拿到这个问题,作为一个图像处理的小白,第一反应是能不能像使用PS一样,把这张RGB的图片转化为ARGB的图片. ...

  2. 边缘检测后去除噪点_修图前vs修图后,原来那些网红“照骗”都是这样修出来的!...

    如今手机上有许多功能强大的后期app 都能帮助我们轻松实现一键修图 我们也经常可以在网上看到 各路大神们各显神通的手机修图作品 无论是风景.人像还是创意 修图前和修图后对比强烈.美若两图 看到这里你是 ...

  3. python去除图片复杂背景_如何去除图片背景?这款一键抠图软件帮你

    对有些小伙伴来说,使用PhothoShop去除图片背景,抠出想要的元素,操作过程繁琐又复杂.今天给大家分享一款好用的抠图软件,简单几步,即可去除图片背景. 傲软抠图是一款专业的智能抠图软件,只需你上传 ...

  4. gels imagej 图片处理_如何使用imageJ做到将图片的某些东西消除而不影响图片背景...

    如何使用imageJ做到将图片的某些东西消除而不影响图片背景 process,Noise,despeckle opening 不知减法 1-2 道某些东西指的什么噪点,还是非阳性细胞的干扰.首先,对于 ...

  5. 如何去除图片背景颜色?怎样将背景色变透明?

    小伙伴在处理图片的时候,一定会遇到去除图片背景色的情况,即使处理一张图片也是件很痛苦的事情.经常处理图片的小伙伴可以使用ps,对于不会PS的小伙伴如果有一款简单好用的去除图片背景颜色工具,就可以节省很 ...

  6. 5个免费的AI智能抠图工具,一键去除图片背景!

    分享5个免费的高质量抠图网站,都是AI自动抠图,操作简单抠图速度快,而且抠图效果好,就连头发丝都能抠干净,还支持更换不同背景! 1.remove.bg 一个AI智能抠图工具,不需要注册登录,打开即用, ...

  7. gif一键抠图 在线_remove.bg 自动抠图、一键去除图片背景的免费在线工具

    傻瓜式操作,一键实现 PS 抠图一样的效果,有了它谁还用 PS 抠图? remove.bg 一键抠图 remove.bg 是一款强大的自动去除图片背景的在线工具,只需要上传图片,自动帮你去掉背景留下主 ...

  8. 如何在线去除图片背景?小白也能轻松操作

    如何在线去除图片背景?可以使用压缩图的图片去底色功能,一键在线去除图片背景,小白也能轻松搞定.下面是具体操作步骤: 1.打开压缩图网站,点击导航栏图片去底色功能. 2.点击选择图片按钮上传图片,左侧可 ...

  9. remove.bg - 自动抠图、一键去除图片背景的免费在线工具

    傻瓜式操作,一键实现 PS 抠图一样的效果,有了它谁还用 PS 抠图? remove.bg 一键抠图 remove.bg 是一款强大的自动去除图片背景的在线工具,只需要上传图片,自动帮你去掉背景留下主 ...

最新文章

  1. 【Science】CMU机器学习系主任:八个关键标准判别深度学习任务成功与否
  2. NVIDIA Jetson Xavier NX分配磁盘空间
  3. python字符识别_crnn(基于pytorch、python3) 实现不定长中文字符识别
  4. 静态链接中的那点事儿(1)
  5. SAP 电商云 Spartacus UI 同 SAP Customer Data Cloud 的集成
  6. iOS底层探索之多线程(十四)—关于@synchronized锁你了解多少?
  7. winform:關於画非客户区
  8. c++ string取子串_LeetCode第三题 “无重复字符的最长子串” 从低效率到高效率
  9. 今天写了个查看 ABAP 类层级的程序
  10. 《redis设计与实现(第二版)》
  11. sql插入后返回id
  12. 4.16 期货每日早盘操作建议
  13. 极客大学产品经理训练营:数据分析与用户数据 第17课总结
  14. 软考高级 真题 2011年上半年 信息系统项目管理师 案例分析
  15. PHP学习之SAPI
  16. 电热玻璃水壶CE认证检测标准介绍
  17. 2018年我跑去做淘宝了(续篇)
  18. sprintf()和itoa()的区别
  19. 【机器学习】生成式模型和判别式模型
  20. 想练八段锦?扔掉可爱漫画版吧,现在出真人教练版了!

热门文章

  1. skywalking(太空漫步)
  2. 【机器学习概率统计】08 极限思维:大数定理与中心极限定理
  3. c语言中f的作用是什么,在C语言中printf中、《f》是什么?
  4. Spring AOP自定义注解并获取注解的参数
  5. 我的世界服务器修改末地难度,我的世界带你解锁进入末地的高难度姿势
  6. Stalled:一次请求超时异常处理
  7. called detach on an already detached child ViewHolder
  8. 知乎live笔记02 《如何自我矫正含胸驼背》
  9. 对MTK的pdaf对焦方式的分析
  10. shardingsphere 分片策略_shardingsphere-proxy 自定义分库,按年月日,季度,周分表规则...