[opencv][python] 学习手册3:练习代码1

[opencv][python] 学习手册3:练习代码1

37_找出图片中的网球.py
38_抠出网球.py
39_替换绿幕背景.py
40_图像二值化-treshold处理.py
41_图像二值化处理api.py
42_处理明暗相间的图片.py
43_自适应阈值-处理明暗相间的图片.py
44_图像二值化_OTSU大津算法.py
45_图像二值化_三角阈值.py




37_找出图片中的网球.py

代码

"""
需求:

对物体进行分割、定位

步骤:
1. 读取图像
2. 获取图像 HSV
3. 定义网球 HSV 范围(lowerColor, upperColor)
4. 使用 inRange api 筛选网球
5. 显示图像,等待按键

hsv 值参考课件表格
"""
import logging

import cv2 as cv

logging.basicConfig(level=logging.INFO)

# 1. 读取图像
filename = r"../img/tenis1.jpg"
# filename = r"../img/lina.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)

# 2. 获取图像 HSV
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)

# 3. 定义网球 HSV 范围(lowerColor, upperColor)
lower_color = (26, 43, 46)
upper_color = (55, 255, 255)

# 4. 使用 inRange api 筛选网球
dst = cv.inRange(hsv, lower_color, upper_color)

# 5. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("hsv", hsv)
cv.imshow("dst", dst)

key = cv.waitKey(0)
logging.info("key = {}".format(key))

cv函数
在这里插入图片描述

需要结合 HSV 色度表确定阈值

运行结果
在这里插入图片描述


38_抠出网球.py

需求

  1. 使用循环抠图
  2. 使用掩膜抠图

代码

"""
需求:

对物体进行分割、定位
并将目标物体从背景中提取出来

步骤:
1. 读取图像
2. 获取图像 HSV
3. 定义网球 HSV 范围(lowerColor, upperColor)
4. 使用 inRange api 筛选网球
5. 通过dst与src,循环将目标物体抠出
5.2. 通过 掩膜 将目标物体抠出
6. 显示图像,等待按键

hsv 值参考课件表格
"""
import logging

import cv2 as cv
import numpy as np

logging.basicConfig(level=logging.WARNING)

# 1. 读取图像
filename = r"../img/tenis1.jpg"
# filename = r"../img/lina.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
logging.info("src shape::[{0}]".format(src.shape))

# 2. 获取图像 HSV
hsv = cv.cvtColor(src, cv.COLOR_BGR2HSV)
logging.info("hsv shape::[{0}]".format(hsv.shape))

# 3. 定义网球 HSV 范围(lowerColor, upperColor)
lower_color = (26, 43, 46)
upper_color = (55, 255, 255)

# 4. 使用 inRange api 筛选网球
dst = cv.inRange(hsv, lower_color, upper_color)  # output array of the same size as src and CV_8U type
logging.info("dst shape::[{0}]".format(dst.shape))

# 5. 方法一:通过dst与src,循环将目标物体抠出
h = src.shape[0]
w = src.shape[1]
tar = np.zeros(src.shape, src.dtype)
for row in range(h):
    for col in range(w):
        # dst 为 0 的位置 src 也为 0
        color = dst[row, col]  # CV_8U
        logging.info("color dtype::[{0}]".format(color.dtype))
        if color != 0:
            tar[row, col] = src[row, col]

# 5.2. 方法二:通过 掩膜 将目标物体抠出
# tar2 = np.zeros(src.shape, src.dtype)
tar2 = src.copy()  # 使用浅拷贝
tar2[dst == 0] = (0, 0, 0)

# 6. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("hsv", hsv)
cv.imshow("dst", dst)
cv.imshow("tar", tar)
cv.imshow("tar2", tar2)

key = cv.waitKey(0)
logging.info("key = {}".format(key))

运行结果
在这里插入图片描述


39_替换绿幕背景.py

代码

"""
需求:
1. 读取目标图像,读取背景图像(同尺寸),获得图像信息
2. 将目标图像转化成 HSV 图像
3. 抠出目标图像绿幕背景
4. 抠出目标图像目标,使用掩膜
5. 抠出背景图像的目标图像的对应位置,使用掩膜
6. 将目标图像与背景图像相加
7. 显示图像,等待按键
"""
import logging

import cv2 as cv

# 1. 读取目标图像,读取背景图像(同尺寸),获得图像信息
filename_tar = r"../img/lion.jpg"
filename_bgd = r"../img/room.jpg"
tar = cv.imread(filename_tar, cv.IMREAD_COLOR)
bg = cv.imread(filename_bgd, cv.IMREAD_COLOR)

# 2. 将目标图像转化成 HSV 图像
hsv_tar = cv.cvtColor(tar, cv.COLOR_BGR2HSV)

# 3. 抠出目标图像绿幕背景,对照 hsv 表
lower_color = (35, 43, 46)
upper_color = (77, 255, 255)
# lower_color = (100, 80, 40)
# upper_color = (140, 120, 60)
dst = cv.inRange(hsv_tar, lower_color, upper_color)

# 4. 抠出目标图像目标,使用掩膜
tar[dst == 255] = (0, 0, 0)

# 5. 抠出背景图像的目标图像的对应位置,使用掩膜
bg[dst == 0] = (0, 0, 0)

# 6. 将目标图像与背景图像相加
result = tar + bg

# 7. 显示图像,等待按键
cv.imshow("tar", tar)
cv.imshow("bgd", bg)
cv.imshow("dst", dst)
cv.imshow("result", result)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

运行结果
在这里插入图片描述
在这里插入图片描述

思考:如何将狮子的阴影一同抠出


40_图像二值化-treshold处理.py

代码

"""
需求:

手动实现图像二值化

1. 读取原图像,转化成灰度图像,获取图像信息
2. 通过阈值 + 灰度图,实现 二值图 binary 的改变
3. 显示图像,等待按键
"""
import logging

import cv2 as cv
import numpy as np

# 1. 读取原图像,转化成灰度图像,获取图像信息
filename = r"../img/car.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
h = src.shape[0]
w = src.shape[1]

# 2. 通过阈值 + 灰度图,实现 二值图 binary 的改变
binary = np.zeros(gray.shape, gray.dtype)
thresh = 50
for row in range(h):
    for col in range(w):
        color = gray[row, col]
        # 阈值判断
        # if color >= thresh:
        #     binary[row, col] = 255
        # else:
        #     binary[row, col] = 0
        binary[row, col] = 255 if color >= thresh else 0

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("gray", gray)
cv.imshow("binary", binary)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

运行结果
在这里插入图片描述


41_图像二值化处理api.py

代码

"""
需求:

手动实现图像二值化

1. 读取原图像,转化成灰度图像,获取图像信息
2. 通过阈值 + 灰度图,实现 二值图 binary 的改变
3. 显示图像,等待按键
"""
import logging

import cv2 as cv
import numpy as np


# 思考,如何传入多个参数
def change_thresh(in_thresh):
    global binary, h, w, gray
    # 使用 双 for 循环,效率低
    # for row in range(h):
    #     for col in range(w):
    #         color = gray[row, col]
    #         # 阈值判断
    #         # if color >= thresh:
    #         #     binary[row, col] = 255
    #         # else:
    #         #     binary[row, col] = 0
    #         binary[row, col] = 255 if color >= in_thresh else 0

    # 使用掩膜,效率高
    binary[gray >= in_thresh] = 255
    binary[gray < in_thresh] = 0

    cv.imshow("binary", binary)


# 0. 配置日志
logging.basicConfig(level=logging.INFO)

# 1. 读取原图像,转化成灰度图像,获取图像信息
filename = r"../img/car.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
h = src.shape[0]
w = src.shape[1]

# 2. 通过阈值 + 灰度图,实现 二值图 binary 的改变
binary = np.zeros(gray.shape, gray.dtype)

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("gray", gray)
cv.imshow("binary", binary)
cv.createTrackbar("thresh", "binary", 0, 255, change_thresh)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

运行结果
在这里插入图片描述


41_二值化_api.py

代码

"""
需求:
1. 读取图像,转化为灰度图
2. 使用 threshold api + 二值化参数 处理图像 + 滑动条
3. 显示图像,等待按键
"""
import logging

import cv2 as cv

# 1. 读取图像,转化为灰度图
filename = r"../img/car.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 2. 使用 threshold api + 二值化参数 处理图像 + 滑动条
thresh = 50
max_val = 255
type = cv.THRESH_BINARY_INV
retv, binary = cv.threshold(gray, thresh, max_val, type)
logging.info("retv = [{0}]".format(retv))

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("gray", gray)
cv.imshow("binary", binary)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

cv函数
在这里插入图片描述
在这里插入图片描述

运行结果
在这里插入图片描述


41_二值化_api_滑动条.py

代码

"""
需求:
1. 读取图像,转化为灰度图
2. 使用 threshold api + 二值化参数 处理图像 + 滑动条
3. 显示图像,等待按键
"""
import logging

import cv2 as cv
import numpy as np


def change_thresh(thresh):
    global binary
    max_val = 255
    _type = cv.THRESH_BINARY_INV
    # 这个函数优化的很好,滑动条非常流畅
    ret_v, binary = cv.threshold(gray, thresh, max_val, _type)
    logging.info("ret_v = [{0}]".format(ret_v))
    cv.imshow("binary", binary)


# 0. 配置日志
logging.basicConfig(level=logging.INFO)

# 1. 读取图像,转化为灰度图
filename = r"../img/car.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 2. 使用 threshold api + 二值化参数 处理图像 + 滑动条
binary = np.zeros(gray.shape, gray.dtype)

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("gray", gray)
cv.imshow("binary", binary)
cv.createTrackbar("thresh", "binary", 0, 255, change_thresh)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

运行结果
在这里插入图片描述


42_处理明暗相间的图片.py

代码

"""
需求:

cv api 二值法 处理明暗相间的图像,带滑动条

1. 读取图像,转化成灰度图
2. 使用 api 对灰度图进行调整,写成滑动条回调函数形式
3. 显示图像,等待按键
"""

import logging

import cv2 as cv
import numpy as np


# 2. 使用 api 对灰度图进行调整,写成滑动条回调函数形式
def change_thresh(in_thresh):
    global gray
    _type = cv.THRESH_BINARY
    ret_v, binary = cv.threshold(gray, in_thresh, 255, _type)
    cv.imshow("binary", binary)


# 0. 配置日志
logging.basicConfig(level=logging.INFO)

# 1. 读取图像,转化成灰度图
filename = r"../img/thresh1.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 创建gray同属性画布
binary = np.zeros(gray.shape, gray.dtype)

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("gray", gray)
cv.imshow("binary", binary)

cv.createTrackbar("thresh", "binary", 0, 255, change_thresh)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

运行结果
在这里插入图片描述


43_自适应阈值-处理明暗相间的图片.py

需求

  • 使用自适应阈值的中值法或高斯法处理图像
  • 用一个全局值作为阈值。但是在所有情况下这可能都不太好,自适应阈值阈值可以帮助。
  • 算法基于其周围的小区域确定像素的阈值。因此,为同一图像的不同区域获得不同的阈值。
  • 这为具有不同照明的图像提供了更好的结果。

在这里插入图片描述

代码

"""
需求:

使用 cv api adaptiveThreshold 进行二值化处理

1. 读取图像,转化成灰度图
2. 使用 api adaptiveThreshold 对灰度图进行调整
3. 显示图像,等待按键
"""

import logging

import cv2 as cv

# 0. 配置日志
logging.basicConfig(level=logging.INFO)

# 1. 读取图像,转化成灰度图
# filename = r"../img/thresh1.jpg"
filename = r"../img/car.jpg"
src = cv.imread(filename, cv.IMREAD_COLOR)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 2. 使用 api adaptiveThreshold 对灰度图进行调整
#                            1.灰图   2.最大值  3.求阈值的算法         4.阈值处理方式    5.分块大小 6.算法需要的敞亮常量
binary_gaussian = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 11, 2)
binary_mean = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 11, 2)

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("gray", gray)
cv.imshow("binary_gaussian", binary_gaussian)
cv.imshow("binary_mean", binary_mean)

key = cv.waitKey(0)
logging.info("key = [{0}]".format(key))

cv函数
在这里插入图片描述

运行结果
在这里插入图片描述


44_图像二值化_OTSU大津算法.py

代码

"""
需求:
# 0. 配置日志
# 1. 读取图像,转化成灰度图
# 2. 二值化,调用大津算法
# 3. 显示图像,等待按键
"""
import logging
import cv2 as cv

# 0. 配置日志
logging.basicConfig(level=logging.INFO)

# 1. 读取图像,转化成灰度图
src = cv.imread("../img/lingjian.png")
grayImg = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

# 2. 二值化,调用大津算法
value, binary = cv.threshold(grayImg, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)
logging.info("value = [{0}]".format(value))

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("grayImg", binary)
cv.waitKey()

运行结果
在这里插入图片描述


45_图像二值化_三角阈值.py

代码

"""
需求:
# 0. 配置日志
# 1. 读取图像,转化成灰度图
# 2. 二值化,调用大津算法
# 3. 显示图像,等待按键
"""
import logging

import cv2 as cv
import matplotlib.pyplot as plt

# 0. 配置日志
logging.basicConfig(level=logging.INFO)

# 1. 读取图像,转化成灰度图
src = cv.imread("../img/lingjian.png")
grayImg = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

fig = plt.figure()
fig.canvas.set_window_title("hist")
plt.hist(grayImg.ravel(), bins=256)

# 2. 二值化,调用大津算法
value, binary = cv.threshold(grayImg, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_TRIANGLE)
logging.info("value = [{0}]".format(value))

# 3. 显示图像,等待按键
cv.imshow("src", src)
cv.imshow("grayImg", binary)
plt.show()
cv.waitKey()

"""
    阈值处理小结:
        当前所使用的阈值,二值图 = cv.threshold(灰图,阈值,最大值,处理方式)
              针对某种场景,手工调阈值
              快速得到二值图 : THRESH_BINARY|THRESH_OTSU
              若是一个三角直方图 : THRESH_TRIANGLE 三角阈值   

        cv.adaptiveThreshold(灰图,最大值,算法(高斯、均值),块大小,常量)
              图像中明暗相间差异比较大
"""

运行结果
在这里插入图片描述
在这里插入图片描述


&&. 阈值处理小结

阈值处理小结:
    当前所使用的阈值,二值图 = cv.threshold(灰图,阈值,最大值,处理方式)
          针对某种场景,手工调阈值
          快速得到二值图 : THRESH_BINARY|THRESH_OTSU
          若是一个三角直方图 : THRESH_TRIANGLE 三角阈值   

    cv.adaptiveThreshold(灰图,最大值,算法(高斯、均值),块大小,常量)
          图像中明暗相间差异比较大

&&. 参考


&&. 问题解决

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值