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

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签