Opencv学习笔记(二)-----常用的处理方法_opencv 图像值为大于255的float时系统会自动做何处理-程序员宅基地

技术标签: cv  计算机视觉  边缘检测  opencv  


前言

本篇记录使用opencv处理图像时经常使用的几种处理方法,一般会混合使用以达到最好的效果;每种方法有详细代码、原图和处理后图片的对比图。


1.阈值处理

cv2.threshold (src, thresh, maxval, type)
src:原图片的灰度图,必须是单通道;
thresh:阈值,取值范围0~255;
maxval:填充色,取值范围0~255;
type:阈值类型见下表;
注:保持原色即原像素点的值

阈值 小于阈值的像素 大于阈值的像素
THRESH_BINARY 0 maxval
THRESH_BINARY_INV maxval 0
THRESH_TRUNC 保持原色 maxval
THRESH_TOZERO 0 保持原色
THRESH_TOZERO_INV 保持原色 0

代码如下:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 读取灰度图像--根据灰度图像的阈值对图像进行二值化处理
img_gray = cv2.imread('credit_card_01.png',0)#读取灰度图像
ret,thresh1 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img_gray,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img_gray,127,255,cv2.THRESH_TOZERO_INV)

titles = ["Original Image","BINAYR","BINARY_INV","TRUNC","TOZERO","TOZERO_INV"]
images = [img_gray,thresh1,thresh2,thresh3,thresh4,thresh5]

for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],"gray")
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

上图为原图,下图为各个阈值处理后的图

原图
阈值处理后

2.平滑操作

平滑操作的几种方法;第一张图为均值滤波图、高斯滤波图、中值滤波对比图;第二张为均值滤波图、方框滤波图、方框滤波越界对比图;

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('picture.png')

blur = cv2.blur(img,(3,3))  #均值滤波,简单的平均卷积操作,通常用奇数
box1 = cv2.boxFilter(img,-1,(3,3),normalize=True)    #方框滤波,基本和均值滤波一样,可选择归一化
box2 = cv2.boxFilter(img,-1,(3,3),normalize=False)    #方框滤波,基本和均值滤波一样,可选择归一化容易越界,越界时大于255的值在图像中显示为全白
aussian = cv2.GaussianBlur(img,(5,5),1)             #高斯滤波,高斯模糊的卷积核里的数值满足卷积的高斯分布,相当于重视中间的
#卷积核就是[n,n]
median = cv2.medianBlur(img,5)      #中值滤波,相当于用中值代替

res = np.hstack((blur,aussian,median))
cv2.imshow('picture-1',res)#为图1:均值滤波图、高斯滤波图、中值滤波对比图
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

res2 = np.hstack((blur,box1,box2))
cv2.imshow('picture-2',res2)#为图2:均值滤波图、方框滤波图、方框滤波越界对比图
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

3.形态学变化

1.腐蚀和膨胀

# -*- coding: utf-8 -*-
import cv2
import numpy as np
img = cv2.imread('dige.png')
#腐蚀操作
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations=1)#iterations表示操作次数
#膨胀操作
dilate = cv2.dilate(erosion,kernel,iterations=1)  #腐蚀操作过后对图片造成一定损伤,用膨胀操作还原图像
res = np.hstack((img, erosion, dilate))
cv2.imshow('erosion', res)
cv2.imwrite('contrast2.png', res)
#contrast2为原图、腐蚀、膨胀操作对比图
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2.开运算和闭运算

开运算:先腐蚀再膨胀;
闭运算:先膨胀再腐蚀;

# -*- coding: utf-8 -*-
import cv2
import numpy as np
img = cv2.imread('dige.png')
#开运算:先腐蚀再膨胀--毛刺去掉
kernel = np.ones((5,5),np.uint8)
open = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel)
#闭运算:先膨胀再腐蚀--还是原图像,毛刺并未去掉
close = cv2.morphologyEx(img,cv2.MORPH_CLOSE,kernel)

res = np.hstack((img, open,close))
cv2.imshow('erosion', res)
cv2.imwrite('contrast3.png', res)
#contrast3为原图、开、闭运算对比图
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4.梯度运算

梯度运算=膨胀-腐蚀;

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

#梯度=膨胀-腐蚀
pie = cv2.imread('pie.png')
kernel = np.ones((7,7),np.uint8)
# erosion = cv2.erode(pie,kernel,iterations=5)
# dilate = cv2.dilate(pie,kernel,iterations=5)
gradient = cv2.morphologyEx(pie,cv2.MORPH_GRADIENT,kernel)

res = np.hstack((pie, gradient))
cv2.imshow('erosion', res)
cv2.imwrite('gradient.png', res)
#gradient为原图、梯度运算对比图
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

5.礼帽与黑帽

礼帽 = 原始输入 - 开运算;
黑帽 = 闭运算 - 原始输入;

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('dige.png')
kernel = np.ones((5,5),np.uint8)
#礼帽 = 原始输入 - 开运算结果
tophat = cv2.morphologyEx(img,cv2.MORPH_TOPHAT,kernel)
# 黑帽 = 闭运算 - 原始输入
blackhat = cv2.morphologyEx(img,cv2.MORPH_BLACKHAT,kernel)
res = np.hstack((img, tophat,blackhat))
cv2.imshow('erosion', res)
cv2.imwrite('hat.png', res)
#hat为原图、礼帽、黑帽对比图
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

6.图像梯度-Sobel算子

dst = cv2.Sobel(sec,ddepth,dx,dy,ksize)
ddepth:图像深度,##深度一般设置为-1,表示输出深度和输入深度一样
dx和dy:表示水平和竖直方向
ksize:是Sobel算子大小

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

def cv_show(img,name,writename):
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
#读取图像
img = cv2.imread('pie.png')
#只有边界位置才会有梯度
#右减左,右为白=255,左为黑=0,所以从原图中,sobelx形成的图为左半边:右减左=白减黑>0,未显示的右半边图为右减左=黑减白<0,不显示原因是opencv对小于0的数做一个截断为0,所以要取绝对值
#左右边界计算和显示
sobelx1 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#写成能表示负数的形式,且dx=1,dy=0表示计算的是水平方向
sobelx2 = cv2.convertScaleAbs(sobelx1)#取绝对值
res = np.hstack((img, sobelx1,sobelx2))
cv_show(res,"sobelx",'X-sobelx.png')#X-sobelx为X方向原图,上边界的、和所有边界对比图

在这里插入图片描述

#上下边界计算和显示
sobely1 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#
sobely2 = cv2.convertScaleAbs(sobely1)#取绝对值
res = np.hstack((img, sobely1,sobely2))
cv_show(res,"sobely",'Y-sobely.png')#Y-sobely为Y方向原图,上边界的、和所有边界对比图

在这里插入图片描述

#上下边界的相加
# 分别计算X和Y,再相加
sobelxy = cv2.addWeighted(sobelx2,0.5,sobely2,0.5,0)#相加的系数根据项目修改
#直接相加和间接相加对比
sobelxy1 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)#直接计算水平和竖直方向
sobelxy2 = cv2.convertScaleAbs(sobelxy1)
res = np.hstack((sobelxy,sobelxy2))
cv_show(res,"indirect sobelxy2",'indirect X+Y.png')#Y-sobely为间接相加、直接相加对比图

在这里插入图片描述
用彩色图片对比代码和效果如下

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt
#加载彩色图片看看效果,读入的彩色图像的灰度图
def cv_show(img,name,writename):
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
img = cv2.imread('pie.png',0)    
sobelx1 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)#写成能表示负数的形式,且dx=1,dy=0表示计算的是水平方向
sobelx2 = cv2.convertScaleAbs(sobelx1)#取绝对值
sobely1 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)#
sobely2 = cv2.convertScaleAbs(sobely1)   
#间接相加
sobelxy = cv2.addWeighted(sobelx2,0.5,sobely2,0.5,0)#相加的系数根据项目修改    
#直接相加
sobelxy1 = cv2.Sobel(img,cv2.CV_64F,1,1,ksize=3)#直接计算水平和竖直方向
sobelxy2 = cv2.convertScaleAbs(sobelxy1)

res = np.hstack((img,sobelxy,sobelxy2))
cv_show(res,"colours",'Dispose picture2.png')#三种方法对比图

在这里插入图片描述

7.三种算子对比

Sobel算子、Scharr算子和Laplacian算子;

# -*- coding: utf-8 -*-
import cv2
import numpy as np

# 08图像梯度-Scharr算子
# 图像梯度-laplacian算子:对噪音更敏感,所以会和其他方法一起使用效果更好
# 这两种算子对图像处理的效果更好
# 三种算子的差异对比
def cv_show(img,name,writename):
    cv2.imshow(name,img)
    cv2.imwrite(writename,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

img = cv2.imread('picture.png',0)
sobelx1 = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3)
sobelx2 = cv2.convertScaleAbs(sobelx1)
sobely1 = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3)
sobely2 = cv2.convertScaleAbs(sobely1)
sobelxy = cv2.addWeighted(sobelx2,0.5,sobely2,0.5,0)

scahrrx = cv2.Scharr(img,cv2.CV_64F,1,0)
scahrrx = cv2.convertScaleAbs(scahrrx)
scahrry = cv2.Scharr(img,cv2.CV_64F,0,1)
scahrry = cv2.convertScaleAbs(scahrry)
scahrrxy = cv2.addWeighted(scahrrx,0.5,scahrry,0.5,0)

laplacian = cv2.Laplacian(img,cv2.CV_64F)
laplacian = cv2.convertScaleAbs(laplacian)

res = np.hstack((img,sobelxy, scahrrxy,laplacian))
#原图、sobel算子、scahrr算子、laplacian算子对比图
cv_show(res,'res','08-Comparison operator.png')

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_37060589/article/details/116015364

智能推荐

STM32利用硬件I2C读取MPU6050陀螺仪数据-程序员宅基地

文章浏览阅读328次。参 数:GyroX GyroY GyroZ 陀螺仪X、Y、Z轴的数据,使用输出参数的形式返回,范 围:-32768~32767。参 数:AccX AccY AccZ 加速度计X、Y、Z轴的数据,使用输出参数的形式返回,范 围:-32768~32767。配置完MPU6050的各个功能寄存器,剩下的就是读取陀螺仪的数据了。电源管理寄存器1,取消睡眠模式,选择时钟源为X轴陀螺仪。电源管理寄存器2,保持默认值0,所有轴均不待机。配置寄存器,配置DLPF。

flume配置文件后不能跟注释!!_flume报错[error - org.apache.flume.sinkrunner$pollin-程序员宅基地

文章浏览阅读339次。说我这个文件打不开,我一查,后面有段注释,删了再跑?哟,正常了,原来如此~_flume报错[error - org.apache.flume.sinkrunner$pollingrunner.run(sinkrunner.j

【华为云技术分享】人脸识别算法的训练之路(下)_模型训练中一个batch包含训练人脸id的关系-程序员宅基地

文章浏览阅读3.1k次。人脸识别算法的训练之路(上)人脸识别人脸识别问题本质是一个分类问题,即每一个人作为一类进行分类检测,但实际应用过程中会出现很多问题。第一,人脸类别很多,如果要识别一个城镇的所有人,那么分类类别就将近十万以上的类别,另外每一个人之间可获得的标注样本很少,会出现很多长尾数据。根据上述问题,要对传统的CNN分类网络进行修改。我们知道深度卷积网络虽然作为一种黑盒模型,但是能够通过数据训练的方式去表征图片或者物体的特征。因此人脸识别算法可以通过卷积网络提取出大量的人脸特征向量,然后根据相似度判断与底库比较_模型训练中一个batch包含训练人脸id的关系

Python基础篇——Day8_attributeerror: 'person' object has no attribute '-程序员宅基地

文章浏览阅读242次。Python基础篇——Day8方法重载方法的动态性私有属性和私有方法(实现封装)@property 装饰器面向对象三大特征继承类成员的继承和重写重写__str__()方法super()方法多重继承多态组合特殊属性方法重载不像其它语言(如JAVA),在Python中没有方法的重载,定义多个同名的方法,只有最后一个生效方法的动态性Python是动态语言,我们可以动态地为类添加新的方法,或者动态地修改类已有的方法操作示例:'''测试方法的动态性'''class Person: def work_attributeerror: 'person' object has no attribute 'play

SAP事务码MM17物料主数据批量维护 -程序员宅基地

文章浏览阅读1.1k次。这个事务码真的很有意思,因为可以看到物料主数据不同层次的内容。为什么这么说呢?进入MM17 _mm17批量创建物料

局域网访问docker ,docker 在windows下端口映射,局域网访问_win11 docker-compose 局域网访问-程序员宅基地

文章浏览阅读1.8k次。1.打开VM VirtualBox ,设置网卡的端口映射。以homeassistant为例,只需要填入8123即可。2.在Kitematic (Alpha)中将192.168.99.100:8123映射到8123端口。3.此时在局域网即可输入主机IP:端口号,进行访问。..._win11 docker-compose 局域网访问

随便推点

eclipse自动生成变量名快捷键_eclipse什么快捷键可以生成变量名-程序员宅基地

文章浏览阅读2.1w次,点赞11次,收藏10次。原创:http://blog.csdn.net/siphiababy/article/details/74179684 ctrl+2+L这个快捷键可自动补全代码,极大提升编码效率!注:ctrl和2同时按完以后释放,再快速按L。比如写这句代码:Graphics g = image.getGraphics();只需要先写方法image.getGraphics() 然后按ct..._eclipse什么快捷键可以生成变量名

Python爬虫入门——3.9 Scrapy爬虫实战_scrapy python 3.9-程序员宅基地

文章浏览阅读1.5k次。声明:搬运自“ 从零开始学Python网络爬虫 ”作者:罗攀,蒋仟机械工业出版社ISBN:9787111579991上一节我们讲了Scrapy框架的安装以及基本信息,这一节我们就开始使用Scrapy框架进行知乎数据的爬取。首先利用命令管理器创建一个知乎的项目项目。具体做法是在打开的命令管理器输入 ˚F:(我要创建项目的盘) cd F:\ soft_exercise \ pytho..._scrapy python 3.9

MachO--文件结构详解-程序员宅基地

文章浏览阅读1.6k次。概念——什么是MachO? 苹果开发者对它一定不陌生,特别是喜欢逆向的同学,对它的研究更是必不可少。在可安装的每一个.app包中,都有一个与app同名的可执行文件,它可能长这样:(如果你碰到显示为白色的MachO文件,说明当前用户对其没有可执行权限) MachO其实是Mach Object的缩写,是在Mac以及iOS上可执行的一种文件格式,包括但不限于:可执行文件(.out .o)、动态库、..._macho文件结构

STM32F407 之 按键实验_stm32407按键切换怎么实现-程序员宅基地

文章浏览阅读5.9k次。1、实验目的:利用板载的四个按键,来控制板载的4个LED等的亮灭。2、硬件资源1)LED 灯 D9、D10、D11、D122)蜂鸣器3)四个按键:S7、S8、S9、S1硬件连接:3、软件设计1、key.c#include "key.h"#include "delay.h" //按键初始化函数void KEY_I_stm32407按键切换怎么实现

UE4项目性能优化思路和方法总结(上)_ue4渲染fps低是什么编程原因-程序员宅基地

文章浏览阅读6.1k次,点赞3次,收藏19次。UE4项目-性能优化思路和方法,我将从底层的原理开始讲,了解我们到底在优化什么? 什么是根本的影响因素? 怎么分析在具体项目中是什么制约了项目的性能,以及从这些更本因素出发找到优化的方法,通常我们作为用户来评价一款游戏性能的好坏,最直观地就是从游戏的画面渲染出来的精美程度所谓渲染:就是说将像素填进显存中,从而使我们能看见画面效果例如逆水寒就是非常成功的案例其次我们的用户会从运行游戏所消耗的性能来评价,直观一点的就是电脑手机的运行是否卡顿,CPU和显卡是否消耗很高,操作是否流畅,反应是否灵敏,_ue4渲染fps低是什么编程原因

c语言goto语句写法,C语言goto语句-程序员宅基地

文章浏览阅读485次。C语言goto语句C语言goto语句实例代码教程 - goto语句在C编程语言提供的goto无条件跳转到带标签的语句相同的功能。goto语句在C编程语言提供的goto无条件跳转到带标签的语句相同的功能。注意:强烈建议不要使用goto语句在任何编程语言,因为它使得难以追踪程序的控制流,使程序难以理解和难以修改。可以重写任何程序,使用一个goto,因此,它不需要goto语句。语法:在C语言中 goto..._c goto 写法

推荐文章

热门文章

相关标签