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


    目录

    1.文章内容来源

    2.图像的进阶操作

      2.1.边界填充

      2.2.数值计算

      2.3.图像融合

      2.4.图像保存

      2.5.视频读取

    3.课后习题代码复现

     3.1.问题一图像像素颜色

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

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

    4.易错点总结与反思


    1.文章内容来源

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

    2.图像的进阶操作

       2.1.边界填充

    1. 常见的边界填充的方法有如下5种:
    2. BORDER_REPLICATE :复制法,也就是复制最边缘像素
    3. BORDER_REFLECT :反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcb|ajabcdefghjhg|fedcb
    4. BORDER_REFLECT_101 :反射法,也就是以最边缘像素为轴、对称、gfedcb|jabcdefghi|gfedcba
    5. BORDER_WRAP :外包装法 abcdefgh|abcdefgh|abcdefgh
    6. BORDER_CONSTANT : 常量法,常数值填充,填充一个常数value(效果不好)
    1. #%%
    2. import cv2
    3. import matplotlib.pyplot as plt
    4. img = cv2.imread(r"cv.jpg")
    5. top_size,buttom_size,left_size,right_size = (50,50,50,50)# 定义图片显示大小
    6. # 复制法,也就是复制最边缘像素
    7. replicate = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REPLICATE)
    8. # 反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcb|ajabcdefghjhg|fedcb
    9. reflect = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT)
    10. # 反射法,也就是以最边缘像素为轴、对称、gfedcb|jabcdefghi|gfedcba
    11. reflect01 = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_REFLECT_101)
    12. # 外包装法 abcdefgh|abcdefgh|abcdefgh
    13. wrap = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_WRAP)
    14. # 常量法,常数值填充,填充一个常数value(效果不好)
    15. constant = cv2.copyMakeBorder(img,top_size,buttom_size,left_size,right_size,borderType=cv2.BORDER_CONSTANT)
    16. #绘制效果图
    17. figure=[img,replicate,reflect,reflect01,wrap,constant]
    18. title=[u'ORIGINAL',u'REPLICATE',u'REFLECT',u'REPLICATE01',u'WRAP',u'CONSTANT']
    19. for i in range(6):
    20. plt.subplot(2,3,i+1)
    21. plt.imshow(figure[i],'gray')
    22. plt.title(title[i]),plt.xticks([]),plt.yticks([])
    23. plt.show()

      2.2.数值计算

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

      2.3.图像融合

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

     

     2.4.图像保存

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

     2.5.视频读取

    1. #%%
    2. import cv2
    3. video = cv2.VideoCapture(r"lihuatian.mp4")
    4. # 检查是否打开正确
    5. if video.isOpened():
    6. # 我们都知道视频和游戏其实都是由图像组成的,通过访问图像的帧数连贯形成的,这里也是一样
    7. # video.read() 一帧一帧地读取
    8. # open 得到的是一个布尔值,就是 True 或者 False
    9. # frame 得到当前这一帧的图像
    10. open, frame = video.read()
    11. else:
    12. open = False
    13. #如果打开正确的话,进行每帧的遍历
    14. while open:
    15. ret, frame = video.read()
    16. # 如果读到的帧数不为空,那么就继续读取,如果为空,就退出
    17. if frame is None:
    18. break
    19. if ret == True:
    20. # 转换为灰度图
    21. #gray = cv2.cvtColor(frame, cv2.COLOR_UNCHANGED)
    22. cv2.imshow("video",frame)
    23. # 这里使用 waitKey 可以控制视频的播放速度,数值越小,播放速度越快
    24. # 这里等于 27 也即是说按下 ESC 键即可退出该窗口
    25. if cv2.waitKey(10) & 0xFF == 27:
    26. break
    27. video.release()
    28. cv2.destroyAllWindows()

     

    3.课后习题代码复现

     3.1.问题一图像像素颜色

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

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

    1. 颜色操作方法:
    2. Method 1.数据img[i,j]上直接进行操作
    3. Method 2.b,g,r = img.item((i, j, 0)),img.item((i, j, 1)), img.item((i, j, 2))
    4. 必须分别指明bgr
    1. #%%
    2. import numpy as np
    3. import cv2
    4. import math
    5. def hacker(img):
    6. height, width, channels = img.shape
    7. for i in range(0, width):
    8. for j in range(0, height):
    9. b, g, r = img[i, j]
    10. hack_b = int(math.pow(b/256.0, 3/2) * 256)
    11. hack_g = int(math.pow(g/256.0, 4/5) * 256)
    12. hack_r = int(math.pow(r/256.0, 3/2) * 256)
    13. img[i, j] = (hack_b, hack_g, hack_r)
    14. if __name__ == '__main__':
    15. img_origin = cv2.imread('lena.png', cv2.IMREAD_COLOR)
    16. img = cv2.imread('lena.png', cv2.IMREAD_COLOR)
    17. print(img.size)
    18. print(img.shape)
    19. hacker(img)
    20. print('显示图片,请按任意键退出')
    21. numpy_horizontal_concat = np.concatenate((img_origin, img), axis=1)
    22. cv2.imshow('Lena图片黑客帝国化', numpy_horizontal_concat)
    23. cv2.waitKey()
    24. cv2.destroyAllWindows()

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

    1. 1.首先我们需要知道这个图片的轴是在哪?
    2. 图片的轴是在以左上角为轴向下做y轴正方向,向右边做x轴正方向
    3. 2.所以messi的球的轨迹还原是y减小x增大的路径的。
    4. 3.我们描述的适合,都是习惯(x,y),但在cv很多方面都是使用(y,x)坐标。
    1. import cv2
    2. import numpy as np
    3. if __name__ == '__main__':
    4. img = cv2.imread('ball.jpg', cv2.IMREAD_COLOR)
    5. start = [493, 594]
    6. end = [112, 213]
    7. ball = img[start[0]:start[1], end[0]:end[1]]
    8. x_step = 101
    9. y_step = 10
    10. for i in range(-1, 4):
    11. # TODO(You): 请在此实现代码
    12. x_offset = x_step*i
    13. y_offset = y_step*i
    14. img[start[0]-y_offset:start[1]-y_offset, end[0]+x_offset:end[1]+x_offset] = ball
    15. cv2.imshow("ball_continue", img)
    16. cv2.waitKey(0)
    17. cv2.destroyAllWindows()

    4.易错点总结与反思

    1. 1.边界填充的方法有很多种,最好别用恒值填充。
    2. 2.灰度值计算具有溢出原则,超过255就又从0开始计算了。
    3. 3.图像保存用imwrite(),路径最好不要用中文。
    4. 4.OPENCV中默认的颜色通道是BGR。
    5. 5.用item()函数操作颜色的时候一定要指明是BGR。
    6. 6.图片的坐标轴是从左上方为原点,向下为y轴正半轴,向右为x轴正半轴。

  • 相关阅读:
    59页数字乡镇综合解决方案
    纠删码创新点整理
    python中列表的基础解释
    chatglm3-6b部署及微调
    ElementUI入门到入土
    STM32驱动AHT10&OLED显示温湿度
    微信小程序预览图片无法上传问题
    基于SSM+Vue的鲜花销售系统/网上花店系统
    应用第三方ByteTrack实现目标跟踪
    核心解读 - 2022版智慧城市数字孪生标准化白皮书
  • 原文地址:https://blog.csdn.net/m0_71819746/article/details/133610516