1.3.OpenCV技能树--第一单元--图像的基础操作(进阶篇)

目录

1.文章内容来源

2.图像的进阶操作

2.1.边界填充

2.2.数值计算

2.3.图像融合

2.4.图像保存

2.5.视频读取

3.课后习题代码复现

3.1.问题一图像像素颜色

3.2.问题二图片黑客帝国化

3.3.问题三梅西的足球轨迹

4.易错点总结与反思


1.文章内容来源

python 复制代码
1.题目来源:https://edu.csdn.net/skill/opencv/opencv-819f137c35c64f76945bcd7e60d37807?category=657&typeId=20811
2.资料来源:https://edu.csdn.net/skill/opencv/opencv-819f137c35c64f76945bcd7e60d37807?category=657&typeId=20810#___44

2.图像的进阶操作

2.1.边界填充

python 复制代码
常见的边界填充的方法有如下5种:
BORDER_REPLICATE :复制法,也就是复制最边缘像素
BORDER_REFLECT :反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcb|ajabcdefghjhg|fedcb
BORDER_REFLECT_101 :反射法,也就是以最边缘像素为轴、对称、gfedcb|jabcdefghi|gfedcba
BORDER_WRAP :外包装法 abcdefgh|abcdefgh|abcdefgh
BORDER_CONSTANT : 常量法,常数值填充,填充一个常数value(效果不好)
python 复制代码
#%%
import cv2 
import matplotlib.pyplot as plt
img = cv2.imread(r"cv.jpg")
top_size,buttom_size,left_size,right_size = (50,50,50,50)# 定义图片显示大小

# 复制法,也就是复制最边缘像素
replicate = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)

# 反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcb|ajabcdefghjhg|fedcb
reflect = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)

# 反射法,也就是以最边缘像素为轴、对称、gfedcb|jabcdefghi|gfedcba
reflect01 = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)

# 外包装法 abcdefgh|abcdefgh|abcdefgh
wrap = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)

# 常量法,常数值填充,填充一个常数value(效果不好)
constant = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT)
#绘制效果图
figure=[img,replicate,reflect,reflect01,wrap,constant]
title=[u'ORIGINAL',u'REPLICATE',u'REFLECT',u'REPLICATE01',u'WRAP',u'CONSTANT']
for i in range(6):
    plt.subplot(2,3,i+1)
    plt.imshow(figure[i],'gray')
    plt.title(title[i]),plt.xticks([]),plt.yticks([])
plt.show()

2.2.数值计算

python 复制代码
数值计算方法与原则:
图片的灰度值范围为0-255,如果超出范围就会作溢出计算。
example:
    如果一个灰度值为254的像素点,做加法运算+10,则表示为254+10=264>255;
    此时该点的像素值为264-255=9
python 复制代码
import cv2 
img = cv2.imread(r"cv.jpg")
img2 = img + 100
img[:5,:,0]
print(img)
print("*******************************")
print(img2)

2.3.图像融合

python 复制代码
图像融合:
   1.图像融合要求我们两张图片的H和W必须是一样的。
   2.我们首先获取第一张图片的大小。
   3.我们然后用resize()函数来修改第二张图片大小与第一张图片相同。
   4.这里注意img.shape()返回的是(H,W),resize()需要输入的是(W,H)
   5.最后再用addWeighted()函数融合获得图片即可
python 复制代码
#%%
import cv2 as cv
import matplotlib.pyplot as plt
import numpy as np
img = cv.imread(r"cv.jpg")
print(img.shape)#打印出来的是(1748,2400)
img_cat = cv.imread(r"data_data.jpg")
img_cat = cv.resize(img_cat,(2400,1748))#设置与 img 一样的数值
res = cv.addWeighted(img,0.4,img_cat,0.6,0)
plt.imshow(res)
plt.xticks([]),plt.yticks([])
plt.show()

2.4.图像保存

python 复制代码
#%%
"""
图像的保存非常简单,只需要使用 imwrite() 方法即可将图像保存起来
千万注意最好别加中文
"""
import cv2 
img = cv.imread("./cv.jpg",cv.IMREAD_GRAYSCALE)# 读取图像
# 图像保存
cv.imwrite("./cv_demo.jpg",img)# 第一个参数是图像要保存的路径,第二个图像是要保存的图像

2.5.视频读取

python 复制代码
#%%
import cv2
video = cv2.VideoCapture(r"lihuatian.mp4")
# 检查是否打开正确
if video.isOpened():
    # 我们都知道视频和游戏其实都是由图像组成的,通过访问图像的帧数连贯形成的,这里也是一样
    # video.read() 一帧一帧地读取
    # open 得到的是一个布尔值,就是 True 或者 False
    # frame 得到当前这一帧的图像
    open, frame = video.read()
else:
    open = False

#如果打开正确的话,进行每帧的遍历
while open:
    ret, frame = video.read()
    # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
    if frame is None:
        break
    if ret == True:
        # 转换为灰度图
        #gray = cv2.cvtColor(frame, cv2.COLOR_UNCHANGED)
        cv2.imshow("video",frame)
        # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
        # 这里等于 27 也即是说按下 ESC 键即可退出该窗口
        if cv2.waitKey(10) & 0xFF == 27:
            break
video.release()
cv2.destroyAllWindows()

3.课后习题代码复现

3.1.问题一图像像素颜色

python 复制代码
#%%
"""
认识颜色空间,OpenCV 常用的颜色空间有RGB颜色空间、HSV颜色空间、Lab颜色空间。
以下选项中不正确打印像素(100,100)处颜色空间分量名字的是?
"""
#OPENCV中默认的颜色通道是BRG!!!
import numpy as np
import cv2 as cv
if __name__ == '__main__':
    img = cv.imread('lena.png', cv.IMREAD_COLOR)
    px = img[100, 100]
    print(f'blue:{px[0]}, green:{px[0]}, red:{px[0]}')

3.2.问题二图片黑客帝国化

python 复制代码
颜色操作方法:
Method 1.数据img[i,j]上直接进行操作
Method 2.b,g,r = img.item((i, j, 0)),img.item((i, j, 1)), img.item((i, j, 2))
                    必须分别指明bgr
python 复制代码
#%%

import numpy as np
import cv2
import math

def hacker(img):
    height, width, channels = img.shape
    for i in range(0, width):
        for j in range(0, height):
            b, g, r = img[i, j]
            hack_b = int(math.pow(b/256.0, 3/2) * 256)
            hack_g = int(math.pow(g/256.0, 4/5) * 256)
            hack_r = int(math.pow(r/256.0, 3/2) * 256)
            img[i, j] = (hack_b, hack_g, hack_r)

if __name__ == '__main__':
    img_origin = cv2.imread('lena.png', cv2.IMREAD_COLOR)
    img = cv2.imread('lena.png', cv2.IMREAD_COLOR)
    print(img.size)
    print(img.shape)

    hacker(img)

    print('显示图片,请按任意键退出')
    numpy_horizontal_concat = np.concatenate((img_origin, img), axis=1)
    cv2.imshow('Lena图片黑客帝国化', numpy_horizontal_concat)
    cv2.waitKey()
    cv2.destroyAllWindows()

3.3.问题三梅西的足球轨迹

python 复制代码
   1.首先我们需要知道这个图片的轴是在哪?
     图片的轴是在以左上角为轴向下做y轴正方向,向右边做x轴正方向
   2.所以messi的球的轨迹还原是y减小x增大的路径的。
   3.我们描述的适合,都是习惯(x,y),但在cv很多方面都是使用(y,x)坐标。
python 复制代码
import cv2
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('ball.jpg', cv2.IMREAD_COLOR)
    start = [493, 594]
    end = [112, 213]
    ball = img[start[0]:start[1], end[0]:end[1]]
    x_step = 101
    y_step = 10
    for i in range(-1, 4):
        # TODO(You): 请在此实现代码
        x_offset = x_step*i
        y_offset = y_step*i
        img[start[0]-y_offset:start[1]-y_offset, end[0]+x_offset:end[1]+x_offset] = ball
    cv2.imshow("ball_continue", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4.易错点总结与反思

python 复制代码
1.边界填充的方法有很多种,最好别用恒值填充。
2.灰度值计算具有溢出原则,超过255就又从0开始计算了。
3.图像保存用imwrite(),路径最好不要用中文。
4.OPENCV中默认的颜色通道是BGR。
5.用item()函数操作颜色的时候一定要指明是BGR。
6.图片的坐标轴是从左上方为原点,向下为y轴正半轴,向右为x轴正半轴。
相关推荐
lijianhua_97123 小时前
国内某顶级大学内部用的ai自动生成论文的提示词
人工智能
EDPJ3 小时前
当图像与文本 “各说各话” —— CLIP 中的模态鸿沟与对象偏向
深度学习·计算机视觉
蔡俊锋3 小时前
用AI实现乐高式大型可插拔系统的技术方案
人工智能·ai工程·ai原子能力·ai乐高工程
自然语3 小时前
人工智能之数字生命 认知架构白皮书 第7章
人工智能·架构
大熊背3 小时前
利用ISP离线模式进行分块LSC校正的方法
人工智能·算法·机器学习
eastyuxiao4 小时前
如何在不同的机器上运行多个OpenClaw实例?
人工智能·git·架构·github·php
诸葛务农4 小时前
AGI 主要技术路径及核心技术:归一融合及未来之路5
大数据·人工智能
光影少年4 小时前
AI Agent智能体开发
人工智能·aigc·ai编程
charlee444 小时前
最小二乘问题详解17:SFM仿真数据生成
c++·计算机视觉·sfm·数字摄影测量·无人机航测
ai生成式引擎优化技术4 小时前
TSPR-WEB-LLM-HIC (TWLH四元结构)AI生成式引擎(GEO)技术白皮书
人工智能