好玩的OpenCV:图像操作的基本知识(2)
1.1随机生成像素
生成与test.jpg相同大小图片,但是像素是随机生成的。
import numpy as np
import cv2
raw_image = cv2.imread('test图片路径')
cv2.imshow('raw image',raw_image)
#获取图片像素的行数和列数
rows = raw_image.shape[0]
cols = raw_image.shape[1]
#生成像素空数组,整数型。待填充随机色数值
image = np.zeros(shape=(rows,cols,3), dtype=np.uint8)
for r in range(rows):
for c in range(cols):
image[r, c, 0] = np.random.randint(0, 255)
image[r, c, 1] = np.random.randint(0, 255)
image[r, c, 2] = np.random.randint(0, 255)
cv2.imshow('random pixel image', image)
cv2.waitKey()
cv2.destroyAllWindows()
1.2负片
负片(Negative Film)是经曝光和显影加工后得到的影像,其明暗与被摄体相反,其色彩则为被摄体的补色。即
负片上的像素值 = 255-原值
import numpy as np
import cv2
image = cv2.imread('test图片路径')
cv2.imshow('raw image', image)
rows = image.shape[0]
cols = image.shape[1]
for r in range(rows):
for c in range(cols):
image[r, c, 0] = 255-image[r, c, 0]
image[r, c, 1] = 255-image[r, c, 1]
image[r, c, 2] = 255-image[r, c, 2]
cv2.imshow('negative image', image)
cv2.waitKey()
cv2.destroyAllWindows()
1.3图像平铺
生成2*3,两行三列6个美女头像的一张图。
import numpy as np
import cv2
image = cv2.imread('测试头像图片路径')
#原图行数列数
rows = image.shape[0]
cols = image.shape[1]
#新图平铺2行三列,即新图行数变为2倍,列数变为3倍
new_rows = rows * 2new_cols = cols * 3
#生成新图的数组
new_image = np.zeros(shape=(new_rows, new_cols, 3), dtype=np.uint8)
#复制原图的每一个像素
row = 0
col = 0
for now_row in range(new_rows):
for now_col in range(new_cols):
new_image[now_row, now_col, 0] = image[row, col, 0]
new_image[now_row, now_col, 1] = image[row, col, 1]
new_image[now_row, now_col, 2] = image[row, col, 2]
col+=1
#超过原图列数范围,归0,重新开始复制
if col>=cols:
col=0
row+=1
#超过原图行数范围,归0,重新开始复制
if row>=rows:
row=0
cv2.imshow('new image', new_image)
cv2.waitKey()
cv2.destroyAllWindows()
1.4转置矩阵(90度旋转图片)
矩阵的知识,转置
a b
c d
变为
a c
b d
import numpy as np
import cv2
image = cv2.imread('test图片路径')
cv2.imshow('raw image', image)
#transpose()交换ndarray数组的0轴和1轴
new_image = image.copy().transpose(1,0,2)
cv2.imshow('transpose image', new_image)
cv2.waitKey()
cv2.destroyAllWindows()
如果不懂ndarray数组的transpose()方法,可以翻看下numpy基本知识。(真正感到大学的线代开始有用了。)
1.5图像融合
图像融合的原理是,让新图像的每个像素成为源图像中相应位置像素值平均值之和。即 源图片A、B,合成C图。
第m行,n列的像素
C[b,g,r]=(A[b,g,r]+B[b,g,r])/2
代码
import numpy as np
import cv2
#A、B、C图的尺寸相同
A_img = cv2.imread('a图片路径')
B_img = cv2.imread('b图片路径')
cv2.imshow('A', A_img)
cv2.imshow('B', B_img)
rows = A_img.shape[0]
cols = A_img.shape[1]
C_img = np.zeros(shape=(rows, cols, 3), dtype=np.uint8)
for r in range(rows):
for c in range(cols):
C_img[r, c, :] = (A_img[r, c, :]+B_img[r, c, :])/2
cv2.imshow('C',C_img)
cv2.waitKey()
cv2.destroyAllWindows()
1.6 图片镜像
图片镜像是指图片中沿着中间线左右或上下对称。如下图,是沿着中间,左右对称。
假设图片是对称的,图片宽度(图片像素列数)为w,选取任意行(这里选第r行)那么图中对称的两个点A1、A2,其中A1点坐标(r,w1),A2点必然要满足
A1[r,w1,:]= A2[r,w-w1,:]
代码
import numpy as np
import cv2
image = cv2.imread('测试头像路径')
rows = image.shape[0]
cols = image.shape[1]
mirror_col = int(cols/2)
for row in range(rows):
for col in range(mirror_col):
image[row, col, :] = image[row, mirror_col-col,:]
cv2.imshow('mirror image', image)
cv2.waitKey()
cv2.destroyAllWindows()
额,失败了。虽然对称,但并没有按照心想的中间线程左右对称。
1.7图像灰度
图片灰度化原理是,彩色图像中的每个像素颜色由B、G、R三个分量决定,范围都是(0,255)。灰度图像B、G、R三个分量都相同的一种图像。
实现方法:
均值法 求出三分量加总后的均值,赋值到三分量上去
公式法根据RGB变换公式 gray = 0.3R+0.59G+0.11B 将gray赋值到三个分量上去。
OpenCV有cvtColor方法,可以完成灰度化。
1.7.1均值法
import numpy as np
import cv2
image = cv2.imread('测试头像路径')
rows = image.shape[0]
cols = image.shape[1]
for row in range(rows):
for col in range(cols):
average = np.mean(image[row,col,:])
image[row, col, :] = average
cv2.imshow('average image', image)
cv2.waitKey()
cv2.destroyAllWindows()
1.7.2公式法
import numpy as np
import cv2
image = cv2.imread('测试头像图片路径')
rows = image.shape[0]
cols = image.shape[1]
for row in range(rows):
for col in range(cols):
gray = 0.11*image[row,col,0]+0.59*image[row,col,1]+0.3*image[row,col,2]
image[row, col, :] = gray
cv2.imshow('formula image', image)
cv2.waitKey()
cv2.destroyAllWindows()
1.7.3 cvtColor灰度化
import numpy as np
import cv2
image = cv2.imread('测试头像图片路径')
cvt_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
cv2.imshow('cvtColor image', cvt_image)
cv2.waitKey()
cv2.destroyAllWindows()
1.8 图片加噪
加噪->图片变的不清晰。
原理:随机的将素点替换为其他值,比如[225,20,19]
import numpy as np
import cv2
image = cv2.imread('测试头像路径')
rows = image.shape[0]
cols = image.shape[1]
#给图片随机加加5000个噪点
noises = 5000
for i in range(noises):
#从(0,rows)或(0,cols)随机生成一个整数
row = np.random.randint(0, rows)
col = np.random.randint(0, cols)
image[row, col, :] = np.array([225,20,19])
cv2.imshow('noise image', image)
cv2.waitKey()
cv2.destroyAllWindows()
加噪后朦胧美,有木有啊有木有!
项目下载
链接: https://pan.baidu.com/s/1nvLt9bz 密码: xigm
往期文章
【视频】有了selenium,小白也可以自豪的说:“去TMD的抓包、cookie”