分享

好玩的OpenCV:图像操作的基本知识(2)

 大邓的Python 2021-02-23

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三个分量都相同的一种图像。

实现方法:

  1. 均值法 求出三分量加总后的均值,赋值到三分量上去

  2. 公式法根据RGB变换公式 gray = 0.3R+0.59G+0.11B 将gray赋值到三个分量上去。

  3. 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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约