算法学习(二)——图像处理

算法学习(二)——图像处理

首先需要准备图片,最好带有人物的。我这里准备了两张图片

test 算法学习(二)——图像处理

C:\Users\jiangli\Desktop\11\图片\test.jpg

face 算法学习(二)——图像处理

C:\Users\jiangli\Desktop\11\图片\face.jpg

导入工具包

# 图像工具包
import cv2
# 数学工具包
import numpy as ny

展示图片

img = cv2.imread("C:\\Users\\jiangli\\Desktop\\11\\图片\\test.jpg")
cv2.imshow("test111",img)
# cv2.imwrite("D:\\pyspace-yolodemo\\images\\test.jpg",img) #保存图片到指定位置
cv2.waitKey(0)

imshow的第一个参数为该展示图片进行命名,而waitKey(0)表示按下任意键退出,如果不写该语句,则程序将直接执行完毕,不方便观察展示图片的效果

执行结果

exec1 算法学习(二)——图像处理

展示图片属性

比如图片的宽高、大小、颜色分量

# 输出图片形状,其中最后一个参数如果是3表示bgr颜色
print(img.shape)
# 输出图片大小
print(img.size)

# 输出图片的宽高
w = img.shape[0]
h = img.shape[1]
print(w,h)

# 输出图片bgr颜色
(b, g, r) = img[0, 0]
print(b, g, r)

执行结果

exec2 算法学习(二)——图像处理

修改图片指定位置的颜色值

img[0:200, 0:200] = (128, 0, 0)
cv2.imshow("HelloCV", img)
cv2.waitKey(0)

执行结果

exec3 算法学习(二)——图像处理

在图片上面画矩形以及在旁边输出一段文字

red = (0, 0, 255) # b g r
font = cv2.FONT_HERSHEY_COMPLEX_SMALL # 字体大小
cv2.putText(img, "title", (100, 90), font, 4, red)
cv2.rectangle(img, (100, 100), (400, 400), red, 0) # 0:空心, -1:实心
cv2.imshow("HelloCV", img)
cv2.waitKey(0)

执行结果

exec4 算法学习(二)——图像处理

平移图像

# 创建一个变换矩阵
# 平移:x轴正方向(1,0) 200, y轴正方向(0,1) 100
M = ny.float32([[1, 0, 200], [0, 1, 100]])
dst = cv2.warpAffine(img, M, (w, h))
cv2.imshow("Hello", dst)
cv2.waitKey(0)

执行结果

exec5 算法学习(二)——图像处理

旋转图像

# 创建旋转矩阵,参数为旋转中心,旋转角度,缩放比例
N = cv2.getRotationMatrix2D((0.5 * w, 0.5 * h), 45, 0.75)
dst1 = cv2.warpAffine(img, N, (w, h))
cv2.imshow("HelloCV1", dst1)
cv2.waitKey(0)

执行结果

exec6 算法学习(二)——图像处理

合并通道

# 拆分成3个颜色分量通道图片
(B, G, R) = cv2.split(img)
cv2.imshow("blue", B)
cv2.imshow("green", G)
cv2.imshow("red", R)
merge = cv2.merge([B, G, R]) #合并通道
cv2.imshow("merge", merge)
cv2.waitKey(0)

执行结果

exec7 算法学习(二)——图像处理

边缘检测1

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰度图,以便运算
# cv2.imshow("gray",gray)
lab = cv2.Laplacian(img, cv2.CV_64F) # 深度
cv2.imshow("lab1",lab)
lab = ny.uint8(ny.absolute(lab)) # 绝对值化
cv2.imshow("lab2", lab)
cv2.waitKey(0)

执行结果

exec8 算法学习(二)——图像处理

边缘检测2

# canny像素值范围200到240
canny = cv2.Canny(img, 200, 240)
cv2.imshow("canny", canny)
cv2.waitKey(0)

执行结果

exec9 算法学习(二)——图像处理

图片面部识别

imgFace = cv2.imread("C:\\Users\\jiangli\\Desktop\\11\\图片\\face.png")
cas = cv2.CascadeClassifier("face/haarcascade_frontalface_alt2.xml") # 载入级联分类器,即人脸数据库
gray = cv2.cvtColor(imgFace, cv2.COLOR_BGR2GRAY) # 转换为灰度图,以便运算
# 检测人脸:跟数据库进行比较
# 结果集合:每个结果包含人脸的坐标x, y, 长度, 宽度
rects = cas.detectMultiScale(gray)
# 循环结果集合在画面上绘制矩形
for x, y, width, height in rects:
cv2.rectangle(imgFace, (x, y), (x + width, y + height), (0, 0, 255), 3)

cv2.imshow("face", imgFace)
cv2.waitKey(0)

执行结果

exec10 算法学习(二)——图像处理

视频面部识别

# 摄像头编号0(默认) 1 2 3 必须要有参数
camera = cv2.VideoCapture(0)  # 从摄像头读取
# camera = cv2.VideoCapture("C:\\Users\\jiangli\\Desktop\\11\\视频\\trailer.mp4")  # 从指定的视频读取
# python语法,用缩进表示代码块,相当于c的括号
while True:
        # 读取一帧图像,ret为是否读到的返回值,img为读到的图像
        (ok, img) = camera.read()
        if not ok:
                # print("open video failed")
                break
        else:
                # print("open video success")

                cas = cv2.CascadeClassifier("face/haarcascade_frontalface_alt2.xml")  # 载入级联分类器,即人脸数据库
                gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图,以便运算
                # 检测人脸:跟数据库进行比较
                # 结果:人脸的坐标x, y, 长度, 宽度
                rects = cas.detectMultiScale(gray)

                for x, y, width, height in rects:
                        cv2.rectangle(img, (x, y), (x + width, y + height), (0, 0, 255), 3)

                cv2.imshow("face", img)

        if cv2.waitKey(33) & 0xFF == ord('q'):  # 等待33毫秒,输入q跳出
                break

camera.release()
cv2.destroyAllWindows()
cv2.waitKey(0);

执行结果

exec11 算法学习(二)——图像处理