今天我们就来继续看一看OpenCV的使用。


第四篇

  • 一、图片的自由缩放以及边缘裁剪
  • 二、图像色调的调整
  • 三、图像的旋转、平移和翻转
  • 四、使用OpenCV扩大图像数据库
  • 1、色彩的随机变换
  • 2、对鼠标的监控


今天使用的图如下:

opencv黏连 opencv图像裁剪及拼接_python

一、图片的自由缩放以及边缘裁剪

# 1、对于图片的扩缩,OpenCV提供了一个简单的函数:cv2.resize
img = cv2.imread("2.jpg")
dst = cv2.resize(img,(300,300))
cv2.imshow("test",dst)
cv2.waitKey()

我们首先是读取了这张图片,之后对齐进行重新构造(基于矩阵),所以图片的整体是没有变化的,只是外形发生变化:

opencv黏连 opencv图像裁剪及拼接_opencv_02


那么我们也可以进行截取:

# 截取:
img2 = cv2.resize(img,(300,300))
patch_tree = img2[50:200,50:200]
cv2.imshow("test2",patch_tree)
cv2.waitKey()

opencv黏连 opencv图像裁剪及拼接_opencv黏连_03


(这里就是截取了重新构造之后的图片)

二、图像色调的调整

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

结果如图:

opencv黏连 opencv图像裁剪及拼接_opencv黏连_04


如果减去120,就是这样:

opencv黏连 opencv图像裁剪及拼接_OpenCV_05


那么我们再来看看饱和度和明暗度的调整:

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

opencv黏连 opencv图像裁剪及拼接_opencv黏连_06


目前是改变了图片的饱和度,明暗度的调整也是同理,把参数改称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()

opencv黏连 opencv图像裁剪及拼接_opencv_07


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

opencv黏连 opencv图像裁剪及拼接_opencv_08

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

这个就是不停的展出图片。