图像基础
OpenCV作为跨平台的计算机视觉库,拥有包括500多个跨平台图像处理的中,高层API,对图像像素的读写很容易。
导入方式:
import cv2
OpenCV函数对像素点的读写操作可理解为对图像矩阵的存取。OpenCV图像矩阵中每个像素点的值有蓝色值,绿色值,红色值3个部分组成,三色值组合成一个一维数组。假设A图像的高度(行数)为H,宽度(列数)为W,则A图像对应的图像矩阵大小为H*W*3,A图像矩阵可表示为H行W列(共H x W个)像素点的组合。
如果想读取A图像150行20列处的像素值(设A的图像举证变量为img_a),可进行如下访问
img_a[150,20,:]
下面代码中第1行是150行20列处像素的蓝色值,第2行是150行20列处像素的绿色值,第三行是150行20列处像素的红色值。
blue = img_a[150,20,0] green = img_a[150,20,1] red = img_a[150,20,2]
1. 显示图像。首先使用imread(文件名)读取文件,生成图像矩阵,然后调用imshow方法显示图像,调用waitKey()等待按键,最后调用destroyAllWindows()销毁窗口,这样方便查看图像。
import cv2
fn = "001.png"
if __name__ == '__main__':
print('loading %s ...' % fn)
img = cv2.imread(fn) #读取图像文件,生成图像矩阵
cv2.imshow('preview',img) #显示图像
cv2.waitKey() #等待按钮
cv2.destroyAllWindows() #销毁窗口
2.随机生成像素。首先产生空图像矩阵,然后确定矩阵的2000个随机位置,最后将随机位置处的像素值设为随机数数组。
# 随机生成像素产生空图像矩阵,然后确定矩阵的2000个随机位置,最后将随机位置处的像素设为随机数数组
import numpy as np
import cv2
if __name__ == '__main__':
# 行数
sz1 = 200
# 列数
sz2 = 300
print(u'产生空图像矩阵(%d*%d)...' % (sz1,sz2))
img = np.zeros((sz1,sz2,3),np.uint8)
pos1 = np.random.randint(200,size = (2000,1)) #行位置随机数组
pos2 = np.random.randint(300,size = (2000,1)) #列位置随机数组
# low : int #产生随机数的最小值,小于等于
# high : int, optional #给随机数设置个上限,即产生的随机数必须小于high
# size : int or tuple of ints, optional #整数,生成随机元素的个数或者元组,数组的行和列
# dtype : dtype, optional #期望结果的类型
# 在随机位置处设置像素点值
for i in range(2000):
img[pos1[i], pos2[i], [0]] = np.random.randint(0, 255)
img[pos1[i], pos2[i], [1]] = np.random.randint(0, 255)
img[pos1[i], pos2[i], [2]] = np.random.randint(0, 255)
# 显示图像
cv2.imshow('preview', img)
# 等待按键
cv2.waitKey()
# 销毁窗口
cv2.destroyAllWindows()
3.获取图像大小。通过图像矩阵的shape属性获取图像大小,shape返回tuple元组,元组的第1一个元素为高度,第2个元素为宽度,第3个元素为3(像素值有三原色组成)。
import cv2
import numpy as np
fn = '001.png'
if __name__ == '__main__':
print('loading %s ...' % fn)
img = cv2.imread(fn)
#获取图像矩阵大小
sp = img.shape
print('大小',sp)
#高度,即行数
sz1 = sp[0]
#宽度,即列数
sz2 = sp[1]
print('width: %d \n height: %d' % (sz2,sz1))
返回值为:
大小 (692, 362, 3)
width: 362
height: 692
模型图片:

4.调节图像亮度。调节的原理是,将像素值变小,则将亮度调小,全部色彩变暗;将像素值变大,则将亮度条大,全部色彩变亮。
import cv2
import numpy as np
fn='001.png'
if __name__ == '__main__':
print('loading %s ...' % fn)
print(u'正在处理中')
img = cv2.imread(fn)
w = img.shape[1]
h = img.shape[0]
ii = 0
#将全部色彩变暗
for xi in range(0,w):
for xj in range(0,h):
#将像素值整体减少,设为原像素值的20%
img[xj, xi, 0] = int(img[xj, xi, 0] * 0.2)
img[xj, xi, 1] = int(img[xj, xi, 0] * 0.2)
img[xj, xi, 2] = int(img[xj, xi, 0] * 0.2)
#显示进度条
if xi % 10 == 0:
print('.')
cv2.namedWindow('img')
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()
print('正在处理中')
#将像素全部变亮
for xi in range(0,w):
for xj in range(0,h):
#将像素值整体减少,设为原像素值的1020%
img[xj, xi, 0] = int(img[xj, xi, 0] * 10.2)
img[xj, xi, 1] = int(img[xj, xi, 0] * 10.2)
img[xj, xi, 2] = int(img[xj, xi, 0] * 10.2)
#显示图像
cv2.namedWindow('img')
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
5.图像日落效果。日落效果的生成原理是讲蓝色值和绿色值设为原来的70%,红色值不变,设图像举证为img
#日落模式图片
import cv2
import numpy as np
fn = '001.png'
if __name__ == '__main__':
print('loading... %s' % fn)
print(u'正在处理中')
img = cv2.imread(fn)
w = img.shape[0]
h = img.shape[1]
i = 0
#生成日落效果
for xi in range(0,w):
for xj in range(0,h):
img[xi,xj,0] = int(img[xi,xj,0] * 0.7) ###蓝色值位原来的70%
img[xi,xj,1] = int(img[xi,xj,0] * 0.7) ###绿色值为原来的70%
if xi % 10 ==0:
print('.')
cv2.namedWindow('img')
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()
6.负片和水印效果。生成负片是将像素设为(255 - 原值),设图像矩阵为img
#生成负片 b, g, r = cv2.split(img) b = 255 - b g = 255 - g r = 255 - r
水印效果的袁丽丽是,调用putText函数,以图像矩阵为第一个参数,输出内容为第二个参数,在图像上直接输出水印文字。
# 加上水印 cv2.putText(img,'machine learning', (20, 20), cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 0, 0), thickness = 2) cv2.putText(img,'machine learning', (20, 100), cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 0), thickness = 2)
完整代码:
#-*- coding: utf-8 -*-
#负片和水印效果
import cv2
import numpy as np
fn = '001.png'
if __name__ == '__main__':
print('loading %s ...' % fn)
print(u'正在处理中')
#读取图像文件
img = cv2.imread(fn)
#获取图像大小
w = img.shape[0]
h = img.shape[1]
b, g, r = cv2.split(img)
b = 255 - b
g = 255 - g
r = 255 - r
#直接通过索引改变色彩分量
img[:, :, 0] = b
img[:, :, 1] = g
img[:, :, 2] = r
#加上水印
cv2.putText(img, 'machine learning', (20, 20), cv2.FONT_HERSHEY_PLAIN, 2.0, (0, 0, 0),thickness = 2)
cv2.putText(img, 'machine learning', (20, 100), cv2.FONT_HERSHEY_PLAIN, 1.0, (0, 0, 0), thickness = 2)
cv2.namedWindow('img')
cv2.imshow('img',img)
cv2.waitKey()
cv2.destroyAllWindows()
7.图像平铺。图像平铺是先计算图片的大小没生成同样大小的空白图像,然后在空白图像中逐个像素赋值图像,直接将空白图像像素值设为平铺后该位置对应的像素值,复制的顺序是逐行复制,横向平铺5个图像,纵向平铺2个图像,最后显示图像效果。
import cv2
import numpy as np
fn = '001.png'
if __name__ == '__main__':
print('loading %s ...' % fn)
print('正在处理中')
img = cv2.imread(fn)
w = img.shape[1]
h = img.shape[0]
#横向平铺5个图像
sz1 = w * 5
#纵向平铺2个图像
sz2 = h * 2
#创建空白图像,然后将图片排列
myimg1 = np.zeros((sz2,sz1,3),np.uint8)
#逐个像素复制
img_x = 0
img_y = 0
for now_y in range(0,sz2):
#增加行数
for now_x in range(0,sz1):
myimg1[now_y, now_x, 0] = img[img_y, img_x, 0]
myimg1[now_y, now_x, 1] = img[img_y, img_x, 1]
myimg1[now_y, now_x, 2] = img[img_y, img_x, 2]
#增加列数
img_x+= 1
if img_x >= w:
img_x = 0
img_y+= 1
if img_y >= h:
img_y = 0
cv2.namedWindow('img1')
cv2.imshow('img',myimg1)
cv2.waitKey()
cv2.destroyAllWindows()
8.转置并且平铺图像。转置的原理是将图像矩阵转换为他的转置矩阵,转置算法是将新图像矩阵[h,w],处的像素设为原图像矩阵[w,h]处的值(这个值是一维矩阵),相当矩阵转置的算法。设myimg1为图像矩阵。
for now_y in range(0,sz2):
for now_x in range(0,sz1):
myimg1[now_x,now_y,:] = img[img_y,img_x,:]
完整代码:
#图像平铺
import cv2
import numpy as np
fn = '001.png'
if __name__ == '__main__':
print('loading %s ...' % fn)
print('正在处理中')
img = cv2.imread(fn)
w = img.shape[1]
h = img.shape[0]
#横向平铺5个图像
sz1 = w * 2
#纵向平铺2个图像
sz2 = h * 3
#创建空白图像,然后将图片排列
myimg1 = np.zeros((sz1,sz2,3),np.uint8)
#逐个像素复制
img_x = 0
img_y = 0
for now_y in range(0,sz2):
#增加行数
for now_x in range(0,sz1):
myimg1[now_x, now_y,:] = img[img_y, img_x,:]
#增加列数
img_x+= 1
if img_x >= w:
img_x = 0
img_y+= 1
if img_y >= h:
img_y = 0
cv2.namedWindow('img1')
cv2.imshow('img',myimg1)
cv2.waitKey()
cv2.destroyAllWindows()

浙公网安备 33010602011771号