图像基础

  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()

  

 

posted @ 2020-03-12 18:22  King~~~  阅读(202)  评论(0)    收藏  举报