- 一、理论分析
- 二、代码分析
- 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 图像的模糊处理图像的模糊处理,主要加入噪声,主要的方式有
- 均值模糊
- 中值模糊
- 高斯模糊
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()
从左至右以此为,均值模糊,中值模糊,高斯模糊
图像的加密也很简单,就是产生一张随机的密钥图,将原图和密钥图异或运算。得到加密的图片,如果想要获得原图,只需要将加密后的图片在于密钥图异或,即可获得原图片。
或许你会思考,为什么连续与密钥图异或两次得到的图还是原图呢?首先我们要知道异或运算的规则是:“相同为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()
运行结果如下:
下面两张分别为,原图和密钥图
下面两张图分别为,加密后的图与解密后的图
要注意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()
运行结果如下:
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()
运行结果如图所示
图像的几何变换主要分为三类:刚性变换、仿射变换和透视变换,如下图
仿射变换是从一个二维坐标系变换到另一个二维坐标系,属于线性变换。通过已知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()
代码运行结果
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()
代码运行结果:
二值化,顾名思义,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()
代码运行结果如下:
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不变),对左侧图片取反,对左侧图片自适应修正,自适应取二值化的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)