百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

「python opencv 计算机视觉入门」二十、图像变形

bigegpt 2024-09-01 15:22 6 浏览

一、学习目标

  1. 了解图片如何进行镜像
  2. 了解图片如何进行腐蚀
  3. 了解图片如何进行膨胀
  4. 了解图片如何进行开运算
  5. 了解图片如何进行闭运算


目录

「python opencv 计算机视觉零基础实战」 第一节

「python opencv视觉入门到实战」二、格式与摄像头

「python opencv 视觉入门到实战」 三、图像编辑

「python opencv视觉入门到实战」 第四节色彩空间

「python opencv视觉入门到实战」 五、对象追踪

「python opencv视觉零基础到实战」 六、图像运算

「python opencv视觉零基础实战」 七逻辑运算应用

「python opencv视觉零到实战」 八、图片选区操作

「python opencv计算机视觉零基础到实战」 九模糊

「python opencv视觉零基础」 十、图片效果毛玻璃

「python opencv视觉零基础」 十一、指定内容查找

「python opencv 视觉零基础」 十二、 直方图

「python opencv视觉零基础」十三、图片颜色提鲜

「python opencv视觉零基础」十四、直方图反向投影

「python opencv视觉入门」十五用opencv画画

「python opencv 视觉入门」 十六、用鼠标画画

「python 视觉入门」 十八、OpenCV可以画画?

「python opencv视觉入门」 十九、简易绘画板制作

二、了解图片的一般操作(镜像、腐蚀、膨胀、开运算、闭运算)

2.1 了解如何对图片进行镜像操作

在opencv中,我们可以对图片进行镜像操作,镜像是指两个图片某一点开始进行对称。图片的镜像操作其实也是对图像数据进行的操作。
首先读取图片,并且创建一个可拖动的窗口,为了防止镜像后图片过大不利于观察:

import cv2
import numpy as np


img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)

随后获取图片的宽高以及通道,这是因为我们需要对一些数据进行操作,操作的话一定是需要宽高的。我们即将通过宽高创建一张图片,如果我们需要上下镜像,那么就是高度是原来图片的2倍长度。代码如下:

cv2.imshow('src', img)
imgshape = img.shape
height= imgshape[0]
width = imgshape[1]
c = imgshape[2]

随后创建一张高度2的图片,我们需要在这张图片中显示图片镜像的内容,如果镜像是上下进行镜像那么则是高度需要2:

代码如下:

dst = np.zeros([height*2, width, c], np.uint8)

之后就简单了,通过循环嵌套遍历图片的内容,并且从图片的第一列第一行开始给予数据,由于我们的图片是镜像的,所以第一列第一行所需要对称于最后一列最后一行:


代码如下:

for i in range( height ):
    for j in range( width ):
        dst[i,j] = img[i,j]
        dst[height*2-i-1,j] = img[i,j]

以上代码中dst[i,j] = img[i,j]为正常从第一行第一列开始往下对图片进行赋值,dst[height*2-i-1,j] = img[i,j]则表示从最下面一行开始网上赋值,所以height*2-i-1则依次表示从下网上的位置信息。完整代码如下:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)

imgshape = img.shape
height= imgshape[0]
width = imgshape[1]
c = imgshape[2]
dst = np.zeros([height*2, width, c], np.uint8)

for i in range( height ):
    for j in range( width ):
        dst[i,j] = img[i,j]
        dst[height*2-i-1,j] = img[i,j]
cv2.imshow('Image', dst)
cv2.imshow('src', img)
cv2.waitKey(0)

结果如下:

左右镜像和上下镜像相同,只需要将宽度改为2倍宽,循环的时候从最右边进行赋值依次赋值即可,然后长度宽度的循环位置调换一下即可,代码如下:

dst = np.zeros([height, width*2, c], np.uint8)

for i in range( width ):
    for j in range( height ):
        dst[j,i] = img[j,i]
        dst[j,width*2-i-1] = img[j,i]

结果如下:

2.2 了解如何对图片进行腐蚀操作

腐蚀是OpenCV中的形态学操作,腐蚀需要使用erode函数。腐蚀可以使颜色对比突出,但在某些图片上使用腐蚀会适得其反。例如如下案例:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("img_erode",cv2.WINDOW_NORMAL)

cv2.imshow('Image', img)
img_erode = cv2.erode(img,None,iterations=1)
cv2.imshow('img_erode',img_erode) 
cv2.waitKey()

以上代码中,腐蚀使用了erode函数,erode函数的iterations参数越大,腐蚀效果越明显,以下是为1时的腐蚀效果,我们发现在图案边缘处会有明显的黑边。


我们将iterations改为2:

img_erode = cv2.erode(img,None,iterations=2)

效果如下:

我们换一张图片:

2.3 了解如何对图片进行膨胀操作

膨胀操作的简单使用也是非常简单,使用dilate方法,用法与erode类似。膨胀操作也是用如其名,就是变胖。代码如下:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\sss11.png')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("img_dilate",cv2.WINDOW_NORMAL)

cv2.imshow('Image', img)
img_dilate = cv2.dilate(img,None,iterations=2)
cv2.imshow('img_dilate',img_dilate) 
cv2.waitKey()

效果如下:

2.4 了解如何对图片进行开运算与闭运算操作

先腐蚀后膨胀叫做开运算,可以用于降噪。开运算使用morphologyEx函数,需要传入一个卷积核。完整代码如下:

import cv2
import numpy as np

img = cv2.imread(r'C:\Users\mx\Desktop\5566.png')
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.namedWindow("img_dilate",cv2.WINDOW_NORMAL)
kn=np.ones((5,5),np.uint8)#卷积核
cv2.imshow('Image', img)
img_dilate = cv2.morphologyEx(img,cv2.MORPH_OPEN,kn)
cv2.imshow('img_dilate',img_dilate) 
cv2.waitKey()

以上morphologyEx方法传入了img需要操作的图片,MORPH_OPEN表示需要进行的操作,此处为开运算,kn为卷积核。其它代码不再赘述。
结果如下:


闭运算一般可以取出前景物体中的小点,跟开运算用法没什么太大区别,就更改了一个方法而已,完整代码如下:

import cv2
import numpy as np
o=cv2.imread("image\\closing.bmp",cv2.IMREAD_UNCHANGED)
k=np.ones((5,5),np.uint8)
r=cv2.morphologyEx(o,cv2.MORPH_CLOSE,k)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:

通过对比我们明显看到,前景内容中的黑点没了。

三、总结

  1. 了解图片进行镜像需要创建一张图片,上下镜像则需要高度2,左右镜像则需要宽度按2
  2. 了解图片进行腐蚀使用erode方法
  3. 了解图片进行膨胀需要使用dilate方法
  4. 了解图片进行开运算需要使用morphologyEx方法,传参cv2.MORPH_OPEN
  5. 了解图片进行开运算需要使用morphologyEx方法,传参cv2.MORPH_CLOSE

本文首发于ebaina,可查看链接了解更多

相关推荐

LangChain4j如何自定义文档转换器实现数据清洗?

LangChain4j提供了3种RAG(Retrieval-AugmentedGeneration,检索增强生成)实现,我们通常在原生或高级的RAG实现中,要对数据进行清洗,也就是将外接...

Java 8 Stream API 详解(java stream.)

Java8StreamAPI详解一、概述在Java8中,StreamAPI是一个重要的新特性。它为处理集合(如List、Set等)中的元素提供了一种高效且富有表现力的方式。Str...

Java修炼终极指南:185 使用 Stream 过滤嵌套集合

这是面试中的一个经典问题,通常从一个模型开始,如下所示(我们假设集合是一个List):publicclassAuthor{privatefinalStringname;pri...

java8的stream使用小示例(java stream())

据JetBrains发布的2021年开发者生态系统调查,Java8在java使用的版本中仍然是当前最流行的版本。72%的专业开发人员使用Java8作为其在java开发中主要编程语言版本。现...

Node.js Stream - 实战篇(node.js in action)

本文转自“美团点评技术团队”http://tech.meituan.com/stream-in-action.html背景前面两篇(基础篇和进阶篇)主要介绍流的基本用法和原理,本篇从应用的角度,介...

Java Stream:集合处理的api(java 集合操作)

JavaStream流:高效集合处理的函数式编程利器一、什么是JavaStream?Java8引入的StreamAPI是一套用于处理集合数据的流式编程接口,通过函数式风格(无副作用的...

去除 List 中的重复元素,你知道几种实现方法?

去除List中重复元素,这在实际编程或面试中经常遇到,每个人都有习惯的写法吧,这里抛砖引玉,汇总了一些实现方案,开拓思路。准备数据假设数组中有10个数据,可能有重复,需要将重复的数据从数组中去掉。pu...

Java开发者必看!Stream流式编程10个爆款技巧,让你代码优雅飞起

为什么你的Java代码总像拧巴的麻绳?掌握这10个Stream实战技巧,代码效率与优雅度将产生质的飞跃。以下案例均来自真实电商系统场景,带你感受流式编程的降维打击!一、过滤与映射组合拳(Filter...

leetcode每日一题之存在重复元素(存在重复元素 iii)

题:给定一个整数数组,判断是否存在重复元素。如果存在一值在数组中出现至少两次,函数返回true。如果数组中每个元素都不相同,则返回false。比如:输入:[1,2,3,1]输出:true...

告别for循环!揭秘Stream API如何让你的代码简洁度提升300%

一、当传统循环遇上现代需求真实场景复现:某电商平台需要处理10万条订单数据,要求:筛选出金额>500的订单提取用户ID并去重统计VIP用户数量传统实现方案://常规写法Set<Long...

Java中List去重的N种方法:从基础到优雅

Java中List去重的N种方法:从基础到优雅在日常的Java开发中,我们经常会遇到需要对List集合去重的情况。无论是为了清理重复的数据,还是为了优化算法性能,掌握多种去重方式都是一项非常实用的技能...

Java Stream流没用过?常用高频方法

概念Stream流是Java8添加的以一种链式调用的方法处理数据,主要侧重于计算。具有以下相关特点代码简洁链式调用Stream常用方法1.将数组变为当作List操作String[]strArr=...

核医学专业名词索引(M-R)(核医学重点归纳)

M吗啡(morphia)埋藏式心律转复除颤器(implantablecardioverterdefibrillator,ICD)麦角骨化醇(VD2,calciferol)脉冲堆积(pulsepi...

CodeMeter 新版发布(codesigner下载)

威步于2022年8月4日发布CodeMeter7.50及CodeMeter软件保护套装11.10,以下为新版内容。CodeMeterRuntime7.50StreamingSIMDExten...

世界上最小的五轴铣床Pocket NC(最小的五轴加工中心)

PocketNC,由MIT学生研制,还有说法是这款产品的设计者是来自美国蒙大拿州的一对极客夫妻。目前主要有两款产品:PocketNCV2-50,9000美元;PocketNCV2-10,60...