本文讲述如何使用Python + OpenCV完成对图像的基本处理
• 1.安装Anaconda
• 2.下载opencv3
• 3.安装opencv3
https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
(1) https://pypi.org/project/opencv-python/#files
(2) 直接在Conda 环境下 pip install OpenCV [这种方法省事儿 下载安装一键搞定]
(1)在“Anaconda Prompt”内使用语句:pip install 完整路径文件名
(2) 直接在Conda 环境下 pip install OpenCV [这种方法省事儿 下载安装一键搞定]
测试代码
# -*- coding: utf-8 -*-
import cv2
i=cv2.imread("E:\\lesson\\image\\test.png")
cv2.imshow("Demo",i)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite("E:\\lesson\\image\\lesson1.png",i)
读入图像
i = cv2.imread(文件名,显示控制参数)
显示控制参数
cv.IMREAD_UNCHANGED
cv.IMREAD_GRAYSCALE
cv.IMREAD_COLOR
显示图像
cv2.imshow(窗口名,图像名)
cv2.waitKey(delay)
delay:
delay>0 等待delay毫秒
delay<0 等待键盘单击
delay=0 无限等待
cv2.destroyAllWindows() 删除所有窗口
保存图像
cv2.imwrite(文件地址,文件名)
• 灰度图像,返回灰度值。
p=img[88,142]
print( p )
• BGR图像,返回值为B,G,R 的值。
分通道
blue=img[78,125,0]
print(blue)
green=img[78,125,1]
print(green)
red=img[78,125,2]
print(red)
全通道
p=img[78,125]
print§
• 灰度图像
print(img[88,99]) //查看原有值
img[88,99]=255
print(img[88,99])
• BGR图像
分通道
print(img[88,99,0]) //查看原有值
print(img[88,99,1]) //查看原有值
print(img[88,99,2]) //查看原有值
img[88,99,0]=255
img[88,99,1]=255
img[88,99,2]=255
print(img[88,99,0])
print(img[88,99,1])
print(img[88,99,2])
全通道
print(img[88,99)
img[88,99]=[255,255,255]
print(img[88,99)
读取+修改
# -*- coding: utf-8 -*-
import cv2
i=cv2.imread("image\\lena256.bmp",cv2.IMREAD_UNCHANGED)
#请确保当前目录下有灰度图像lena256.bmp
'''
print(i[100,100])
i[100,100]=255
print(i[100,100])
'''
p=i[100,100]
print(p)
i[100,100]=255
p=i[100,100]
print(p)
读取+修改
# -*- coding: utf-8 -*-
import cv2
i=cv2.imread("e:\\lesson\\image\\lenacolor.png",cv2.IMREAD_UNCHANGED)
# 请确保在指定目录下有彩色图像文件
# 更改一个通道
print(i[100,100])
i[100,100,0]=255
print(i[100,100])
'''
同时更改三个通道
print(i[100,100])
i[100,100]=[255,255,255]
print(i[100,100])
'''
'''
更改一个像素块
cv2.imshow("original",i)
i[100:150,100:150]=[0,0,255]
cv2.imshow("result",i)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
返回值=图像.item(位置参数)
•灰度图像,返回灰度值
p=img.item(88,142)
print( p )
• BGR图像,返回值为B,G,R 的值
blue=img.item(78,125,0)
green=img.item(78,125,1)
red=img.item(78,125,2)
print(blue)
print(green)
print(red)
图像名.itemset(位置,新值)
• 灰度图像
print(img.item(88,99))
img.itemset((88,99),255)
print(img.item(88,99))
• BGR图像
print(img.item(88,99,0))
print(img.item(88,99,1))
print(img.item(88,99,2))
img.itemset((88,99,0),255)
img.itemset((88,99,1),255)
img.itemset((88,99,2),255)
print(img.item(88,99,0))
print(img.item(88,99,1))
print(img.item(88,99,2))
读取+修改
import cv2
import numpy as np
i=cv2.imread("image\lena256.bmp",cv2.IMREAD_UNCHANGED)
print(i.item(100,100))
i.itemset((100,100),255)
print(i.item(100,100))
读取+修改
import cv2
import numpy as np
i=cv2.imread("image\lenacolor.png",cv2.IMREAD_UNCHANGED)
'''
print(i.item(100,100,0))
i.itemset((100,100,0),255)
print(i.item(100,100,0))
print(i.item(100,100,1))
i.itemset((100,100,1),255)
print(i.item(100,100,1))
'''
print(i.item(100,100,2))
i.itemset((100,100,2),255)
print(i.item(100,100,2))
• 1 形状:行、列、通道数
• 2 像素数目
• 3 图像的数据类型
• shape 可以获取图像的形状,返回包含行数,列数,通道数的元组。
灰度 返回行数,列数
彩色 返回行数,列数,通道数
范例
import cv2
img1=cv2.imread(‘灰度图像’)
print(img1.shape)
=> (512,512)
import cv2
img2=cv2.imread(‘彩色图像’)
print(img2.shape)
=> (512,512, 3) //512行,512列, 3个通道
• size 可以获取图像的像素数目。
灰度 返回:行数列数
彩色 返回:行数列数*通道数
import cv2
img=cv2.imread(‘图像名’)
print(img.size)
=> 786432
• dtype 返回的是图像的数据类型。
范例
import cv2
img=cv2.imread(‘图像名称’)
print(img.dtype)
=> uint8
import cv2
a=cv2.imread("image\lena256.bmp",cv2.IMREAD_UNCHANGED)
b=cv2.imread("image\lenacolor.png",cv2.IMREAD_UNCHANGED)
print(a.shape)
print(b.shape)
print(a.size)
print(b.size)
print(a.dtype)
print(b.dtype)
• ROI(region of interest),感兴趣区域
import cv2
import numpy as np
women = cv2.imread('./img/women.png')
girl = cv2.imread('./img/girl.bmp')
i = np.ones((1, 1, 3)) # 基底
i = women[220:400, 250:350] # 看样子 i能被 瞬间撑大
print('i -> ', i)
'''
⚠️特别注意
有区域规定时 [180:360, 100:200] -> 则需要完全按规定区域大小办事
'''
# girl = i # 二选一
girl[180:360, 100:200] = i # 二选一
# cv2.imshow('women', women)
cv2.imshow('girl', girl)
cv2.waitKey(-1) # 等待键盘单击
cv2.destroyAllWindows()
.split()
其实在【两种方法】访问像素时,我们已经做过逐个通道的研究了
这里算是提供一种新的 拆分 合并 手法
OpenCV中我们曾用过
• import cv2
• img=cv2.imread(‘图像名’)
• b = img[ : , : , 0 ]
• g = img[ : , : , 1 ]
• r = img[ : , : , 2 ]
如今
• import cv2
• img=cv2.imread(‘图像名’)
• b , g , r = cv2.split(img)
.merge()
⚠️通道顺序 要注意
import cv2
women = cv2.imread('img/women.png')
b, g, r = cv2.split(women)
cv2.imshow('org', women)
cv2.imshow('B', b)
cv2.imshow('G', g)
cv2.imshow('R', r)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
a=cv2.imread("image\lenacolor.png")
b,g,r=cv2.split(a)
bgr=cv2.merge([b,g,r])
cv2.imshow("bgr",bgr)
cv2.waitKey()
cv2.destroyAllWindows()
'''
蓝色与0 0合并
下标法
b = split(a)[0]
'''
import cv2
import numpy as np
a=cv2.imread("image\lenacolor.png")
rows,cols,chn=a.shape
b=cv2.split(a)[0]
g = np.zeros((rows,cols),dtype=a.dtype)
r = np.zeros((rows,cols),dtype=a.dtype)
m=cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey()
cv2.destroyAllWindows()