像素点操作
import cv2 as cv
# cv2.IMREAD_COLOR:彩色图片,默认参数,1
# cv2.IMREAD_GRAYSCALE:灰度图,0
# cv2.IMREAD_UNCHANGED:包括alpha(透明通道),-1
img = cv.imread('./images/cat.jpg',cv.IMREAD_COLOR)
cv.imshow("img",img)
print(img.shape)
# 彩图索引该像素点
B,G,R = img[100,100]
print(f"B={B},G={G},R={R}")
#灰度图索引该像素点
Grey = img[100,100]
print(f"intensity={Grey}")
cv.waitKey(0)
cv.destroyAllWindows()
彩图默认参数
输出结果:
灰度图,通道数为1
输出结果:
转为灰度图
img = cv2.imread("cat.jpg")
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow("", img)
cv2.waitKey()
效果前后都相同
图像缩放
-
下采样,丢像素
# 图像缩放:下采样,丢像素
import cv2
# 读取图像
img = cv2.imread("./images/img.png")
# 从原图像中取出每2个像素点中的一个
img2 = img[::2, ::2]
# 创建窗口
cv2.namedWindow('img2', cv2.WINDOW_NORMAL)
# 调整窗口大小
cv2.resizeWindow('img2', img.shape[1], img.shape[0])
# 在窗口中显示图像
cv2.imshow('img2', img2)
# 等待按键
cv2.waitKey(0)
img1 = cv2.imread("./images/cat.jpg", 0)
h = img1.shape[0]
w = img1.shape[1]
img2 = np.zeros([h * 2, w * 2], dtype='uint8')
for i in range(0, h * 2, 2):
for j in range(0, w * 2, 2):
img2[i, j] = img1[i // 2, j // 2]
img2[i + 1, j] = img1[i // 2, j // 2]
img2[i, j + 1] = img1[i // 2, j // 2]
img2[i + 1, j + 1] = img1[i // 2, j // 2]
cv2.imshow("", img2)
cv2.waitKey()
-
邻近插值法,扩大图片宽高
import cv2
import numpy as np
# 读取图像
img1 = cv2.imread("./images/cat.jpg", 0)
print(img1.shape)
# 获取图像的高度和宽度
h = img1.shape[0]
w = img1.shape[1]
# 创建一个与原图像大小相同的矩阵,用于存储拼接后的图像
img2 = np.zeros([h * 2, w * 2], dtype='uint8')
# 遍历拼接后的图像矩阵
for i in range(0, h * 2, 2):
for j in range(0, w * 2, 2):
# 将原图像的像素值复制到拼接后的图像矩阵中
img2[i, j] = img1[i // 2, j // 2]
img2[i + 1, j] = img1[i // 2, j // 2]
img2[i, j + 1] = img1[i // 2, j // 2]
img2[i + 1, j + 1] = img1[i // 2, j // 2]
# 显示拼接后的图像
cv2.imshow("", img2)
print(img2.shape)
# 等待按键
cv2.waitKey()
绘图函数
画框
import cv2 as cv
img = cv.imread("./images/cat.jpg")
# 左上角坐标,右下角坐标,颜色,线宽
cv.rectangle(img,(70,30),(280,210),(0,0,255),2)
cv.imshow("cat",img)
cv.waitKey(0)
画圆
img = cv.imread("./images/cat.jpg")
# 圆心坐标,半径,颜色,线宽
cv.circle(img,(170,120),100,(0,0,255),2)
cv.imshow("cat",img)
cv.waitKey()
图像上添加文字
img = cv.imread('./images/cat.jpg')
# 图像,文字(不能写中文),起始坐标,字体,字体大小系数,颜色,字体粗细
cv.putText(img, 'black cat', (20, 40), cv.FONT_HERSHEY_SIMPLEX,1, (0, 0, 255), 2)
cv.imshow('', img)
cv.waitKey()
图像上添加中文(PIL和Opencv互转)
import cv2
from PIL import Image, ImageDraw, ImageFont
import numpy as np
img = cv2.imread('./images/cat.jpg') # OpenCV读取为numpy.ndarray()类型
cv2img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # opencv读取通道顺序B、G、R
# opencv是numpy.ndarray()类型 & PIL.Image.open()是WebPImageFile类型
pilimg = Image.fromarray(cv2img) # numpy.ndarray()转换为PIL.Image.Image()类型
draw = ImageDraw.Draw(pilimg)
font = ImageFont.truetype("msjhbd.ttc", 20, encoding="utf-8")
draw.text((20, 20), "黑猫", (255, 0, 0), font=font)
# PIL图片 -->numpy.ndarray() --> OpenCV图片
cv2charimg = cv2.cvtColor(np.array(pilimg), cv2.COLOR_RGB2BGR)
cv2.imshow("cat", cv2charimg)
cv2.waitKey(0)