任务三主要讲了滚动条操作、键盘响应、颜色查找表、通道分离与合并。本次任务主要是对这些功能的opencv的API函数进行了学习应用,完成了实验任务,初步进行了opencv的实践。
(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()
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()
查找表本质就是根据某个递增、递减或某种关系的函数,对像素值0-255这256个值进行计算,然后把计算的结果存储到一张表格中,当我们要对某张图片中的像素值进行颜色变换时,直接从查找表中找计算好的映射值,通过查找表这种方式去提高计算速度的颜色查找表一般用来对图像进行色彩变换。颜色查找表可以加快计算速度。
opencv中有系统查找表可以调用,也可以自定义查找表对图像进行变换。
opencv中LUT支持:
cv.applyColorMap(src, colormap[, dst]) ->dst
第一个参数输入图像
第二个参数是颜色表
dst返回图像
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()
(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()
实验结果: