OpenCV:图片操作基本知识(二)

作者: 大邓和他的python | 来源:发表于2017-08-23 17:42 被阅读1755次

公众号:大邓带你玩python

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()
01-随机像素生成_meitu_1.jpg

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()
image.png

1.3图像平铺

image.png

生成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 * 2
new_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()
image.png

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)
print(new_image.shape)
cv2.imshow('transpose image', new_image)
cv2.waitKey()
cv2.destroyAllWindows()

如果不懂ndarray数组的transpose()方法,可以翻看下numpy基本知识。(真正感到大学的线代开始有用了。)

image.png

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()
image.png

1.6 图片镜像

图片镜像是指图片中沿着中间线左右或上下对称。如下图,是沿着中间,左右对称。

image.png

假设图片是对称的,图片宽度(图片像素列数)为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()
image.png

额,失败了。虽然对称,但并没有按照心想的中间线程左右对称。

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()
image.png

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()
image.png

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()
image.png

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()
image.png

关注公众号:大邓带你玩python

即可下载本文源代码

相关文章

网友评论

    本文标题:OpenCV:图片操作基本知识(二)

    本文链接:https://www.haomeiwen.com/subject/yzhjdxtx.html