今天我们就来继续看一看OpenCV的使用。
第四篇
- 一、图片的自由缩放以及边缘裁剪
- 二、图像色调的调整
- 三、图像的旋转、平移和翻转
- 四、使用OpenCV扩大图像数据库
- 1、色彩的随机变换
- 2、对鼠标的监控
今天使用的图如下:
一、图片的自由缩放以及边缘裁剪
# 1、对于图片的扩缩,OpenCV提供了一个简单的函数:cv2.resize
img = cv2.imread("2.jpg")
dst = cv2.resize(img,(300,300))
cv2.imshow("test",dst)
cv2.waitKey()
我们首先是读取了这张图片,之后对齐进行重新构造(基于矩阵),所以图片的整体是没有变化的,只是外形发生变化:
那么我们也可以进行截取:
# 截取:
img2 = cv2.resize(img,(300,300))
patch_tree = img2[50:200,50:200]
cv2.imshow("test2",patch_tree)
cv2.waitKey()
(这里就是截取了重新构造之后的图片)
二、图像色调的调整
CV2也可以对图片进行色彩和亮度上的调整,也就是所谓的HSV(H是指色调,S是饱和度,V是明暗度)
至于具体的数值,H的取值是[0,180],其他两个都是[0,255]
我们来看一下它们的影响:
色调H
用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,紫色为300°;
饱和度S
饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
明度V
明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
现在我们在程序中具体的看一看把黄色削减:
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
# 下面这一行十分的关键 注意对180的取余
turn_green_hsv[:,:,0] = (turn_green_hsv[:,:,0] - 30) % 180
# 中括号里0表示选择的是色调,1是饱和度,2是明暗度
turn_green_hsv = cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_green_hsv)
cv2.waitKey()
结果如图:
如果减去120,就是这样:
那么我们再来看看饱和度和明暗度的调整:
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
less_color_hsv = img_hsv.copy()
less_color_hsv[:,:,1] = less_color_hsv[:,:,1] * 0.6
turn_img = cv2.cvtColor(less_color_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_img)
cv2.waitKey()
目前是改变了图片的饱和度,明暗度的调整也是同理,把参数改称2就可以了。
三、图像的旋转、平移和翻转
OpenCV中图像的变换主要通过仿射变换矩阵和函数warpAffine()完成。
img = cv2.imread("2.jpg")
M_copy_img = np.array([
[0,0.8,-100],
[0.8,0,-12]
],dtype=np.float32)
img_change = cv2.warpAffine(img,M_copy_img,(300,300))
cv2.imshow("test",img_change)
cv2.waitKey()
其中M_copy_img是仿射变换矩阵,这里前两个矩阵的作用是缩小图形为原来的80%,之后又逆时针旋转90度,再向左平移100个像素单位,并向下平移12个像素单。
四、使用OpenCV扩大图像数据库
1、色彩的随机变换
img = cv2.imread("2.jpg")
img_hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
turn_green_hsv = img_hsv.copy()
turn_green_hsv[:,:,0] = (turn_green_hsv[:,:,0] + np.random.random()) % 180
turn_green_hsv[:,:,1] = (turn_green_hsv[:,:,1] + np.random.random()) % 180
turn_green_hsv[:,:,2] = (turn_green_hsv[:,:,2] + np.random.random()) % 180
turn_green_img = cv2.cvtColor(turn_green_hsv,cv2.COLOR_HSV2BGR)
cv2.imshow("test",turn_green_img)
cv2.waitKey()
2、对鼠标的监控
使用鼠标在生成的图片上标记出目标位置,是最基本的数据处理内容。鼠标操作属于用户接口操作,在OpenCV中同样有相关的函数可以实现,主要由mouse_event实现。
mouse_event函数的功能是监控鼠标操作,对鼠标的点击、移动以及放开做出反应,根据不同的操作进行处理。
对鼠标的监控一共有十种事件:
# define CV_EVENT_MOUSEMOVE 0 滑动
# define CV_EVENT_LBUTTONDOWN 1 左键点击
# define CV_EVENT_RBUTTONDOWN 2 右键点击
# define CV_EVENT_MBUTTONDOWN 3 中键点击
# define CV_EVENT_LBUTTONUP 4 左键释放
# define CV_EVENT_RBUTTONUP 5 右键释放
# define CV_EVENT_MBUTTONUP 6 中键释放
# define CV_EVENT_LBUTTONDBLCLK 7 左键双击
# define CV_EVENT_RBUTTONDBLCLK 8 右键双击
# define CV_EVENT_MBUTTONDBLCLK 9 中键释放
当函数的事件完成后,会返回所在的x、y值,分别代表事件发生时的(x,y)坐标。窗口默认左上为原点,右边为x轴,向下为y轴。
使用示例(按‘q’退出):
img = cv2.imread("2.jpg")
rect_start = (0, 0)
rect_end = (0, 0)
def on_mouse(event,x,y,flags,param):
# 鼠标左键按下,抬起,双击
if event == cv2.EVENT_LBUTTONDOWN:
rect_start = (x,y)
elif event == cv2.EVENT_LBUTTONUP:
rect_end = (x,y)
cv2.rectangle(img,rect_start,rect_end,(0,255,0),2)
cv2.namedWindow('test')
cv2.setMouseCallback("test",on_mouse)
while(1):
cv2.imshow("test",img)
if cv2.waitKey(1) & 0xff == ord('q'):
break
cv2.destroyAllWindows()
这个就是不停的展出图片。