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

智能推荐

python3.7官网中文官网_Python官网宣布,正式发布Python 3.7.0!-程序员宅基地

文章浏览阅读4.2k次。描述Python官网静悄悄地发布了一条大消息:正式发布 Python 3.7.0!同时发布的还有Python 3.6.6稳定版。官网刚刚更新了可下载文档,还在用Python 2.7和Python3.5的你,赶紧用起来!Python官网宣布,正式发布Python 3.7.0!2018年6月27日星期三Python 3.7.0现已推出(同时还有3.6.6版本)!代表Python开发社区和Python ..._python官网

【STM32】HAL库开发教程(四)—串口FIFO使用_stm32h743 hal库使用 串口fifo使用-程序员宅基地

文章浏览阅读5.9k次,点赞7次,收藏34次。前言_stm32h743 hal库使用 串口fifo使用

Spring Tool Suite创建Spring Boot项目时报错_springtoolsuite4无法创建工作空间-程序员宅基地

文章浏览阅读3.8k次。Spring Tool Suite创建springboot项目时pom第一行报错问题一问题二今天想要用STS工具自己创建一个spring boot项目,但是却遇到了几个问题,在网上找了找,最终创建成功,在这里记录一下,如有遇到同样问题可以参考一下。问题一首先是创建spring boot项目在这里就遇到了一个问题,选好要创建的项目之后报了一个错,如图所示:其实这个问题比较好解决,只是对..._springtoolsuite4无法创建工作空间

安卓桌面软件_银河麒麟即时通讯工具教程02:安卓应用安装、启动和卸载-程序员宅基地

文章浏览阅读2.8k次。《银河麒麟即时通讯工具安装和使用》系列教程,将为大家介绍银河麒麟系统上即时通讯工具(微信、QQ、LinuxQQ、麒麟传书)安装、使用、卸载,包括桌面版工具及安卓兼容Kydroid版两类方式,欢迎大家持续关注!作者简介刘煦阳> 湖南长城科技生态研发部工程师> 6年PKS平台支持维护经验> 红帽RHCSA和RHCE认证系统工程师> 首批麒麟KOSE-P认证系统工程师教程目录一、..._银河麒麟安装安卓app

简单c语言程序例子与运行结果图,C语言程序第一次作业-程序员宅基地

文章浏览阅读1.1k次。(一)实验总结1. 求圆面积和周长(1)题目输入圆的半径,计算圆的周长和面积。(2)流程图 (3)测试数据及运行结果测试数据1:r=2运行结果: (4)实验分析没有问题2.判断闰年(1)题目输入一个四位年份,判断其是否是闰年。闰年的判别条件是该年年份能被4整除但不能被100整除、或者能被400整除。(2)流程图 (3)测试数据及运行结果测试数据1:y=1980运行结果: (4)实验分析没错误3.求..._程序运行结果与执行结果图片

[杂七杂八]Pytorch+tensorboard error:unpack require a string argument of length 4-程序员宅基地

文章浏览阅读128次。error:unpack require a string argument of length 4decodeerror: error parsing message这个错误是环境版本问题,我用:python 2.7pytorch 0.4.0tensorboardx 1.9tensorboard 2.0因此,pip uninstall tensorboardpip install tensorboard==1.9.0搞定PS:这些小框架和cudnn的版本、各个库之间的版本配合往往藏着坑

随便推点

sftp 在服务器创建文件夹,windows - 如果尚不存在WinSCP和批处理文件,则在SFTP服务器上创建文件夹 - 堆栈内存溢出...-程序员宅基地

文章浏览阅读845次。我尝试创建文件夹(如果不存在),然后使用Windows批处理文件将文件复制到该文件夹​​,但cmd保持返回错误“未知命令'IF'”。档案: Cycle2201_P.zip如果不存在,则应创建文件夹: Jan文件应传输到远程服务器创建的文件夹: Cycle2201_P.zip远程服务器中的结果: /New/Jan/Cycle2201_P.zip剧本:@echo offecho %date%:AGAI..._error code: 2 error message from server: no such file

聚宽下单、函数、API_聚宽操作发微信代码-程序员宅基地

文章浏览阅读2.6k次,点赞4次,收藏8次。JoinQuant-TWist本文是量化交易零基础入门教程中的一篇,点击蓝字链接可查看该系列详情。摘要函数与API函数使用方法如何看API文档自定义函数方法常用的下单函数自测与自学我们继续以前文策略代码为例进行讲解,如下: def initialize(context): run_daily(period,time='every_bar') g.s..._聚宽操作发微信代码

A*搜索算法在三维路径规划(避障)中的MATLAB实现与Python实现_a*算法三维 路径规划-程序员宅基地

文章浏览阅读2w次,点赞46次,收藏374次。A star algorithmA*搜索算法简介A*搜索算法的Python简化代码MATLAB实现启发函数回溯轨迹RRT算法对比A\*算法在三维路径规划中的一些不足A*搜索算法简介A*搜索算法是Greedy Best-First算法的改进,因为Greedy Best-First算法只考虑将预估距离(当前节点到目标点的预估距离)作为遴选开节点集的条件。即:priority=heuristic(goal,next)priority=heuristic(goal, next)priority=heurist_a*算法三维 路径规划

《算法笔记》3.6小节——入门模拟->字符串处理 问题 E: 字符串去特定字符-程序员宅基地

文章浏览阅读116次。问题 E: 字符串去特定字符时间限制 : 1.000 sec 内存限制 : 32 MB题目描述输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。输入测试数据有多组,每组输入字符串s和字符c。输出对于每组输入,输出去除c字符后的结果。样例输入goaoda样例输出good#include <iostream>#include <cstring>using namespace std;int main() { char str[20_问题 e: 字符串去特定字符

git上代码整体拉到vscode上步骤__git项目更新到本地__vscode更新项目至git_vscodegit拉取最新代码到本地-程序员宅基地

文章浏览阅读5.3k次,点赞3次,收藏18次。git上代码整体拉到vscode上步骤1.将代码克隆到本地2.终端cd到项目的根目录(在其他分支写项目)git项目更新到本地步骤方法一:方法二(好用)vscode 上传本地更改文件至git上方法一:使用命令提交方法二:直接在vscode界面提交(推荐,简单方便)_vscodegit拉取最新代码到本地

Ubuntu20.04安装gtsm_toolbox_gstam anzhuang-程序员宅基地

文章浏览阅读779次。本文详细介绍了在ubuntu20.04系统中安装gtsam-4.0.3 realsease版本的matlab gtsam_toobox库的流程,希望能够帮助更多读者减少安装过程遇到的问题。_gstam anzhuang