opencv十四天入门学习——task3

opencv十四天入门学习——task3

  • 前言
  • 1、滚动条操作
  • 2、键盘响应操作
  • 3、自带颜色表操作
    • 3.1 颜色查找表
    • 3.2 Gamma校正
  • 4、通道分离与合并

前言

任务三主要讲了滚动条操作、键盘响应、颜色查找表、通道分离与合并。本次任务主要是对这些功能的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()

实验结果:
opencv十四天入门学习——task3_第1张图片

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()

实验结果:
opencv十四天入门学习——task3_第2张图片

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()

实验结果:
opencv十四天入门学习——task3_第3张图片

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()

实验结果:

你可能感兴趣的:(opencv十四天入门学习笔记,opencv,学习,python)