机器视觉——OpenCV案例分析基础(三)(图像的模糊、加密、几何变换、融合、二值化等)

12 篇文章 3 订阅
12 篇文章 8 订阅
本文详细介绍了图像处理的多种技术,包括模糊处理(均值、中值、高斯模糊)、图像加密、几何变换(翻转、平移、旋转、放射和透视变换)、图像融合以及二值化。通过实例代码展示了如何使用OpenCV库实现这些操作,并探讨了图像加密的原理。此外,还提供了图像二值化的不同方法,包括阈值处理和自适应阈值处理。
摘要由CSDN通过智能技术生成

一、理论分析

我们在这个博客里介绍一些图像的常用的处理,包括对图像模糊处理,对图像加密,对图像几何变换,多个图像的融合等操作。主要是想要通过案例对图像的操作进行熟悉。

二、代码分析

2.1 图像的模糊处理

图像的模糊处理,主要加入噪声,主要的方式有

  1. 均值模糊
  2. 中值模糊
  3. 高斯模糊
from cv2 import cv2 as cv
import numpy as np

flower = cv.imread("CV-Pictures/036.jpg")
result_mean = cv.blur(flower,(15,15))#一般为奇数(均值模糊,去噪)
result_median = cv.medianBlur(flower,15)#黑白模糊
result_gaussian = cv.GaussianBlur(flower,(9,9),2,2)

cv.imshow("flower",flower)
mean_median_gaussian = np.hstack([result_mean,result_median,result_gaussian])
cv.imshow("result",mean_median_gaussian)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述
从左至右以此为,均值模糊,中值模糊,高斯模糊
在这里插入图片描述

2.2 图像的加密

图像的加密也很简单,就是产生一张随机的密钥图,将原图和密钥图异或运算。得到加密的图片,如果想要获得原图,只需要将加密后的图片在于密钥图异或,即可获得原图片。
或许你会思考,为什么连续与密钥图异或两次得到的图还是原图呢?首先我们要知道异或运算的规则是:“相同为0,相异为1”,那么两张一样的密钥图异或获得的一定是一张黑色的图片(全是0),那么原图与黑色图片异或的话结果也一定是原图,因为不是0的异或还不是0,是0的异或还是0.

from cv2 import cv2 as cv
import numpy as np

def encode(img,img_key):
    result = cv.bitwise_xor(img,img_key)
    return result

flower = cv.imread("CV-Pictures/036.jpg")
h,w,c = flower.shape
img_key = np.random.randint(0,256,(h,w,c),np.uint8)
pic_1 = np.hstack([flower,img_key])
cv.imshow("pic_1",pic_1)
result1 = encode(flower,img_key)
result2 = encode(result1,img_key)
pic_2 = np.hstack([result1,result2])
cv.imshow("pic_2",pic_2)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
下面两张分别为,原图和密钥图
在这里插入图片描述
下面两张图分别为,加密后的图与解密后的图
在这里插入图片描述

2.3 图像的几何变换

2.3.1 图像的翻转变换

要注意0代表针对y轴方向,1代表x轴方向

from cv2 import cv2 as cv
import numpy as np
goose = cv.imread("CV-Pictures/003.jpg")
goose_y = cv.flip(goose,0) #y轴
goose_x = cv.flip(goose,1) #x轴
goose_xy = cv.flip(goose,-1) #x轴y轴
pic = np.hstack([goose,goose_y,goose_x,goose_xy])
cv.imshow("pic",pic)
cv.waitKey(0)
cv.destroyAllWindows()

在这里插入图片描述

2.3.2 图像的平移变换

from cv2 import cv2 as cv
import numpy as np

goose = cv.imread("CV-Pictures/003.jpg")
cv.imshow("goose",goose)
M = np.float32([[1,0,100],[0,1,120]]) #第一个代表宽,第二个代表高
h,w,c = goose.shape
result = cv.warpAffine(goose,M,(w+100,h+120))
cv.imshow("result",result)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下:
在这里插入图片描述
在这里插入图片描述

2.3.3 图像的旋转变换

from cv2 import cv2 as cv
import numpy as np

img = cv.imread(r'CV-Pictures/036.jpg')
h,w = img.shape[:2]
x_h = int(h/2)
y_w = int(w/2)
M = cv.getRotationMatrix2D((x_h,y_w),45,0.8) #调整旋转中心,转换角度(正逆负顺),图片大小
dst = cv.warpAffine(img,M,(w,h)) #先输入宽度在输入高度
print(dst.shape)
pic = np.hstack([img,dst])
cv.imshow('rotate',pic)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如图所示

2.3.4 图像的放射变换和透视变换

图像的几何变换主要分为三类:刚性变换、仿射变换和透视变换,如下图
在这里插入图片描述
仿射变换是从一个二维坐标系变换到另一个二维坐标系,属于线性变换。通过已知3对坐标点可以求得变换矩阵。
透视变换是从一个二维坐标系变换到一个三维坐标系,属于非线性变换。通过已知4对坐标点可以求得变换矩阵。
其中值得注意的是,图像的透视变换,不能保证图像边的平行性。
细节请见:https://zhuanlan.zhihu.com/p/80852438
图像的仿射变换代码:

import cv2
import numpy as np

img=cv2.imread(r'CV-Pictures/036.jpg')
rows=len(img)
cols=len(img[0])

p1=np.zeros((3,2),np.float32)
p1[0]=[0,0]
p1[1]=[cols-1,0]
p1[2]=[0,rows-1]

p2=np.zeros((3,2),np.float32)
p2[0]=[150,0]
p2[1]=[cols-1,0]
p2[2]=[0,rows-1]

M=cv2.getAffineTransform(p1,p2)
dst=cv2.warpAffine(img,M,(cols,rows))

cv2.imshow('img',img)
cv2.imshow('dst',dst)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果
在这里插入图片描述

透视变换代码

import cv2
import numpy as np

img=cv2.imread(r'CV-Pictures/036.jpg')
rows=len(img)
cols=len(img[0])

p1=np.zeros((4,2),np.float32)
p1[0]=[0,0]
p1[1]=[cols-1,0]
p1[2]=[0,rows-1]
p1[3]=[cols-1,rows-1]

p2=np.zeros((4,2),np.float32)
p2[0]=[90,0]
p2[1]=[cols-90,0]
p2[2]=[0,rows-1]
p2[3]=[cols-1,rows-1]

M=cv2.getPerspectiveTransform(p1,p2)
dst=cv2.warpPerspective(img,M,(cols,rows))
pic = np.hstack([img,dst])
cv2.imshow('perspective_img',pic)

cv2.waitKey(0)
cv2.destroyAllWindows()

代码运行结果
在这里插入图片描述

2.4 图像的融合

from cv2 import cv2 as cv
import numpy as np

girl = cv.imread(r"CV-Pictures/015.jpg")
flower = cv.imread(r"CV-Pictures/036.jpg")
h,w = girl.shape[:2]
flower = cv.resize(flower,(w,h)) #将两幅图片大小化为一致
img = cv.addWeighted(girl,0.8,flower,0.1,20) #前两个值代表图片的权重,后一个值代表图片亮度
print(girl.shape)
print(flower.shape)
cv.imshow("img",img)
cv.waitKey(0)
cv.destroyAllWindows()

代码运行结果:
在这里插入图片描述

2.5 图像的二值化

二值化,顾名思义,0和1,对应0和255,即黑和白,也就是我们可以对图像设置一个阈值,大于阈值,为255,小于为0.从而对图像二值化。

2.5.1 产生灰度图

from cv2 import cv2 as cv
import numpy as np

img = cv.imread("CV-Pictures/010.jpg")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.imshow('img',img)
cv.imshow('gray',gray)
cv.waitKey(0)
cv.destroyAllWindows()

代码运行结果如下:
在这里插入图片描述

2.5.2 产生二值化

from cv2 import cv2 as cv
import numpy as np

img = cv.imread("CV-Pictures/010.jpg")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)


ret,dst_inv = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV) #inverse 翻转
ret,dst = cv.threshold(gray,127,255,cv.THRESH_BINARY)
ret,dst_thr = cv.threshold(gray,127,255,cv.THRESH_TRUNC) #小于127的截断为0
pic = np.hstack([gray,dst,dst_inv,dst_thr])
cv.imshow('img',pic)

运行结果如下,从左至右依次是,原图,二值化(小于127为0,大于127为255),反向二值化(对左侧二值化取反),截断二值化(大于127为255)。
在这里插入图片描述

from cv2 import cv2 as cv
import numpy as np

img = cv.imread("CV-Pictures/010.jpg")
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
ret,dst_tz = cv.threshold(gray,127,255,cv.THRESH_TOZERO) #小于127,直接为0
ret1,dst_tz_inv = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV) 
ret2,dst_tz_inv_otsu = cv.threshold(gray,127,255,cv.THRESH_TOZERO_INV+cv.THRESH_OTSU)
adapt_thresh=cv.adaptiveThreshold(gray,255,cv.ADAPTIVE_THRESH_MEAN_C,
                      cv.THRESH_BINARY,19,2)
pic = np.hstack([dst_tz,dst_tz_inv,dst_tz_inv_otsu,adapt_thresh])
cv.imshow('img',pic)
cv.waitKey(0)
cv.destroyAllWindows()

运行结果如下,如图所示,依次为(小于127直接为0,大于127不变),对左侧图片取反,对左侧图片自适应修正,自适应取二值化的值。
在这里插入图片描述

三、代码文件

小程序员将代码文件和相关素材整理到了百度网盘里,因为文件大小基本不大,大家也不用担心限速问题。后期小程序员有能力的话,将在gitee或者github上上传相关素材。
链接:https://pan.baidu.com/s/1Ce14ZQYEYWJxhpNEP1ERhg?pwd=7mvf
提取码:7mvf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值