基础知识
图像是由像素构成的,二值图像非0(黑)即1(白),灰度图像(0-255),RGB图像三通道都是0-255(OpenCV中某像素顺序是BGR)。
像素读取及修改
灰度图
import cv2
img = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
print(img[100, 100]) # 73(第100行,第100列像素值)
img[100, 100] = 255
print(img[100, 100]) # 255
RGB图
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
cv2.imshow("original", img)
print(img[100, 100]) # [ 78 68 178](BGR三通道。第100行,第100列像素值)
img[100, 100, 0] = 255 # 修改0通道(B通道)
print(img[100, 100]) # [255 68 178]
img[100, 100, 1] = 255 # 修改1通道(G通道)
print(img[100, 100]) # [255 255 178]
img[100, 100, 2] = 255 # 修改2通道(R通道)
print(img[100, 100]) # [255 255 255]
img[100:150, 100:150] = [255, 255, 255]
cv2.imshow("result1", img)
img[100:150, 100:150] = [0, 0, 255]
cv2.imshow("result2", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
numpy像素读取及修改
# -*- coding: utf-8 -*-
import cv2
# 灰度图
img1 = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
print(img1.item(100, 100)) # 73
img1.itemset((100, 100), 255)
print(img1.item(100, 100)) # 255
# RGB图
img2 = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
print(img2.item(100, 100, 0)) # 78
img2.itemset((100, 100, 0), 255)
print(img2.item(100, 100, 0)) # 255
获取图像属性
# -*- coding: utf-8 -*-
import cv2
img1 = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
print(img1.shape) # (256, 256) 灰度图,行数和列数
print(img2.shape) # (512, 512, 3) RGB图, 行数和列数和通道数
print(img1.size) # 65536 像素数(灰度图,行数*列数)
print(img2.size) # 786432 像素数(RGB图,行数*列数*通道数)
print(img1.dtype) # uint8
print(img2.dtype) # uint8
图像ROI(region of interest)
# -*- coding: utf-8 -*-
import cv2
import numpy as np
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
face = np.ones((101, 101, 3)) # 101行,101列,3通道的图像
face = img[220:400, 250:350] # 取lenacolor.png的这块区域放在这个图像的左上方
img[0:180, 0:100] = face
cv2.imshow("Demo", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
通道的拆分和合并
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
b, g, r = cv2.split(img) # 拆分成三通道
cv2.imshow("original", img)
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)
merge = cv2.merge([b, g, r]) # 合并三通道,注意顺序b,g,r
cv2.imshow("merge", merge)
cv2.waitKey(0)
cv2.destroyAllWindows()
# -*- coding: utf-8 -*-
import cv2
import numpy as np
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
row, col, channel = img.shape
b = cv2.split(img)[0] # B通道
g = np.zeros([row, col], img.dtype) # G通道全0
r = np.zeros([row, col], img.dtype) # R通道全0
merge = cv2.merge([b, g, r]) # 合并三通道
cv2.imshow("merge", merge)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像加法
前提:参与运算的图像大小、类型必须一致。
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
add1 = img + img # 像素值之和大于255就模255
add2 = cv2.add(img, img) # 像素值之和大于255就是255
cv2.imshow("original", img)
cv2.imshow("add1", add1)
cv2.imshow("add2", add2)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像融合
结果图像=图像1系数1+图像2系数2+亮度调节量
# -*- coding: utf-8 -*-
import cv2
img1 = cv2.imread("C:\\imgs\\add\\lena.bmp", cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("C:\\imgs\\add\\boat.bmp", cv2.IMREAD_UNCHANGED)
result = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow("img1", img1)
cv2.imshow("img2", img2)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像类型转换
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
result = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像缩放
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
result1 = cv2.resize(img, (300, 100)) # 顺序:列、行
row, col, channel = img.shape
result2 = cv2.resize(img, (round(col*0.5), round(row*1.1))) # 注意列行顺序
# 水平方向扩大为1.1倍,垂直方向缩小为0.5倍
result3 = cv2.resize(img, None, fx=1.1, fy=0.5)
cv2.imshow("img", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像反转
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lenacolor.png", cv2.IMREAD_UNCHANGED)
res1 = cv2.flip(img, -1) # flipCode < 0
res2 = cv2.flip(img, 0) # flipCode = 0
res3 = cv2.flip(img, 1) # flipCode > 0
cv2.imshow("img", img)
cv2.imshow("res1", res1)
cv2.imshow("res2", res2)
cv2.imshow("res3", res3)
cv2.waitKey(0)
cv2.destroyAllWindows()
阈值分割
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread("C:\\imgs\\lena256.bmp", cv2.IMREAD_UNCHANGED)
retval1, res1 = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY) # retval1=128
retval2, res2 = cv2.threshold(img, 128, 255, cv2.THRESH_BINARY_INV)
retval3, res3 = cv2.threshold(img, 128, 255, cv2.THRESH_TRUNC)
retval4, res4 = cv2.threshold(img, 128, 255, cv2.THRESH_TOZERO)
retval5, res5 = cv2.threshold(img, 128, 255, cv2.THRESH_TOZERO_INV)
cv2.imshow("img", img)
cv2.imshow("res1", res1)
cv2.imshow("res2", res2)
cv2.imshow("res3", res3)
cv2.imshow("res4", res4)
cv2.imshow("res5", res5)
cv2.waitKey()
cv2.destroyAllWindows()