opencv十四天入门学习——task3

前言

任务三主要讲了滚动条操作、键盘响应、颜色查找表、通道分离与合并。本次任务主要是对这些功能的opencv的API函数进行了学习应用,完成了实验任务,初步进行了opencv的实践。

1、滚动条操作

(1)opencv-python创建滚动条

createTrackbar(const String& trackbarname, const String& winname, int *value, int count, TrackbarCallback onChange = 0, void *userdata = 0)

trackbarname:滚动条名称。
Winname:窗口名称。
value:滑块的初始位置。
count:滑块最大值。
onChange:事件响应回调函数
userdata:传递给回调的用户数据。

(2)事件响应函数

将回调函数名称作为创建滚动条时的参数。

def trackbar_callback (pos):

print(pos)

(3)创建窗口函数

cv.namedWindow(winname [, flags]) -> None

winname:窗口标题

flags:窗口大小调整

(4)获得滚动条当前位置

int getTrackbarPos(const String& trackbarname, const String& winname)

trackbarname:滚动条名称。
winname:窗口名称。

实验代码:

import cv2 as cv
import numpy as np
def trackbar_callback (pos):
    print(pos)

image1 = cv.imread("./apple.jpg")
cv.namedWindow("trackbar_demo", cv.WINDOW_AUTOSIZE)
cv.createTrackbar("lightness", "trackbar_demo", 0, 200, trackbar_callback)
cv.imshow("trackbar_demo", image1)
while True:
    pos = cv.getTrackbarPos("lightness", "trackbar_demo")
    image2 = np.zeros_like(image1)
    image2[:, :] = (np.uint8(pos), np.uint8(pos), np.uint8(pos))
    result = cv.add(image1, image2)
    cv.imshow("trackbar_demo", result)
    c = cv.waitKey(1)
    if c == 27:
        break
cv.waitKey(0)
cv.destroyAllWindows()

实验结果:
在这里插入图片描述

2、键盘响应操作

cv.waitKey( [, delay] ) ->retval

delay:如果没有声明或者delay=0,表示一直阻塞;delay大于0,表示阻塞指定毫秒数

Retval:返回的对应键盘键值,在不同的操作系统中可能会有差异。

实验代码:

import cv2 as cv
import numpy as np

image1 = cv.imread("./apple.jpg")
cv.namedWindow("keyboard_demo", cv.WINDOW_AUTOSIZE)
cv.imshow("keyboard_demo", image1)
while True:
    c = cv.waitKey(10)
    if c == 27:
        break
    elif c == 48:
        cv.imshow("keyboard_demo", image1)
    elif c == 49:
        hsv = cv.cvtColor(image1, cv.COLOR_BGR2HSV)
        cv.imshow("keyboard_demo", hsv)
    elif c == 50:
        ycrcb = cv.cvtColor(image1, cv.COLOR_BGR2YCrCb)
        cv.imshow("keyboard_demo", ycrcb)
    elif c == 51:
        rgb = cv.cvtColor(image1, cv.COLOR_BGR2RGB)
        cv.imshow("keyboard_demo", rgb)
cv.waitKey(0)
cv.destroyAllWindows()

实验结果:
在这里插入图片描述

3、自带颜色表操作

3.1 颜色查找表

查找表本质就是根据某个递增、递减或某种关系的函数,对像素值0-255这256个值进行计算,然后把计算的结果存储到一张表格中,当我们要对某张图片中的像素值进行颜色变换时,直接从查找表中找计算好的映射值,通过查找表这种方式去提高计算速度的颜色查找表一般用来对图像进行色彩变换。颜色查找表可以加快计算速度。

opencv中有系统查找表可以调用,也可以自定义查找表对图像进行变换。

opencv中LUT支持:

cv.applyColorMap(src, colormap[, dst]) ->dst

第一个参数输入图像

第二个参数是颜色表

dst返回图像

3.2 Gamma校正

Gamma校正是对输入图像灰度值进行指数变换,进而校正亮度偏差,通常应用于扩展暗调的细节。一般情况下,当Gamma校正的值大于1时,图像的高光部分被压缩而暗调部分被扩展;当Gamma校正的值小于1时,图像的高光部分被扩展而暗调部分被压缩。 Gamma是以前的CRT台式显示器遗留下来的东西,用来解决显示设备亮度灰阶不足的问题的。

公式p(x, y)表示输入图像像素值,像素值取值范围在0~255之间,每一个值对应一个输出值,这样映射关系,可以先建立查找表LUT;根据输入得像素值作为index,在LUT中直接映射读取得到Gamma校正之后的值。

代码实现滚动条调整0到20是系统查找表变换图片,20到40是Gamma变换自定义查找表,gamma值0.1到2.0。

实验代码:

import cv2 as cv
import numpy as np
def trackbar_callback (pos):
    print(pos)

def get_lut3 (gamma):
    lut3 = np.zeros((256, 1, 3), dtype=np.uint8)
    for i in range(256):
        c = int(np.exp(np.log(i/255.0)*gamma) * 255.0)
        lut3[i, 0] = (c, c, c)
    return lut3

image1 = cv.imread("./apple.jpg")
cv.namedWindow("LUT_window", cv.WINDOW_AUTOSIZE)
cv.createTrackbar("LUT_trackbar", "LUT_window", 0, 40, trackbar_callback)
cv.imshow("LUT_window", image1)
while True:
    pos = cv.getTrackbarPos("LUT_trackbar", "LUT_window")
    if pos <= 20:
        result = cv.applyColorMap(image1, pos)
    else:
        gama = (pos - 20.0)/10.0
        lut3 = get_lut3(gama)
        result = cv.LUT(image1, lut3)

    cv.imshow("LUT_window", result)
    c = cv.waitKey(1)
    if c == 27:
        break
cv.waitKey(0)
cv.destroyAllWindows()

实验结果:
在这里插入图片描述

4、通道分离与合并

(1)通道分离函数

cv.split(m[, mv]) ->mv

m:输入多通道图像

mv:输出图像数组

(2)通道合并函数

cv.merge(mv[, dst])->dst

mv:各个通道图像

dst:返回结果

(3)通道混合函数

cv.mixChannels(src, dst, fromTo)->dst

src:输入多通道图像

fromTo:通道索引

dst:返回结果

(4)通道阈值函数

cv.inRange( src, lowerb, upperb[, dst]) -> dst

src:输入图像

Lowerb:低值

Upperb:高值

dst:返回结果

实验代码:

import cv2 as cv
import numpy as np

image1 = cv.imread("./apple.jpg")
cv.namedWindow("apple",cv.WINDOW_AUTOSIZE)
cv.imshow("apple",image1)
#分割演示
mv = cv.split(image1)
cv.imshow("mv[0]",mv[0])
cv.imshow("mv[1]",mv[1])
cv.imshow("mv[2]",mv[2])
#合并演示
mv[0][:, :] = 0
dst = cv.merge(mv)
cv.imshow("merge result", dst)
#混合演示
dst2 = np.zeros_like(image1)
cv.mixChannels([image1], [dst2], fromTo=[0, 2, 1, 1, 2, 0])
cv.imshow("mix-channnels", dst2)
#阈值演示
mask = cv.inRange(image1, (43, 46, 100),(128, 200, 200))
cv.imshow("inRange", mask)

cv.waitKey(0)
cv.destroyAllWindows()

实验结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

独孤西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值