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

机器视觉——案例分析基础(三)(图像的模糊、加密、几何变换、融合等),第1张

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

图像的模糊、加密、几何变换、融合、二值化
  • 一、理论分析
  • 二、代码分析
    • 2.1 图像的模糊处理
    • 2.2 图像的加密
    • 2.3 图像的几何变换
      • 2.3.1 图像的翻转变换
      • 2.3.2 图像的平移变换
      • 2.3.3 图像的旋转变换
      • 2.3.4 图像的放射变换和透视变换
    • 2.4 图像的融合
    • 2.5 图像的二值化
      • 2.5.1 产生灰度图
      • 2.5.2 产生二值化

一、理论分析

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

二、代码分析 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不变),对左侧图片取反,对左侧图片自适应修正,自适应取二值化的值。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5625135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存