背景

小编最近在接触处理图像的东西,因为研究生搞得是nlp,对于图像处理并不是太在行,但是,在研究生的时候,帮助过其他实验室的处理过部分图像问题,因此,知道还有一个叫opencv的东西,现在用起来,不可谓之不强大。接下来,我带领大家感受一下opencv的魅力所在。

需求

这个需求是这样的,需要通过计算机读取一张图片,然后,在图片上画出需要的图像轨迹,将这个图像抠下来进行后续处理。

过程

  • 首先,百度(惊不惊喜,意不意外);
  • 第二,我百度了一波之后,发现并没有我需要的功能,然后自己去啃了opencv;
  • 第三,把部分函数拿出来,试着调用一番,经调试成功。
    好了,以上就是怎么实现的功能,本篇文章就到这了(这样写肯定被一大群人骂)。

需要的函数

  • imread
    这个函数就比较好懂了,拆开就知道,image,read,读图像;
  • namedWindow
    这个函数也还可以,照样拆开,named,window,窗口命名;
  • imshow
    这个同样道理,图像展示;
  • destroyAllWindows
    这个同样,销毁所有窗口;
  • waitKey
    这个函数,是在imshow之后用,表示图像可以展示多长时间;
  • setMouseCallback
    这个函数才是重点,啥意思呢,响应鼠标操作,主要有三个参数组成,第一,本次操作的名称;第二,需要响应的函数;第三,参数;
    其中第二的响应的函数,里面包括众多的事件:
    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 //中键双击
    Flags:
    define CV_EVENT_FLAG_LBUTTON 1 //左鍵拖曳
    define CV_EVENT_FLAG_RBUTTON 2 //右鍵拖曳
    define CV_EVENT_FLAG_MBUTTON 4 //中鍵拖曳
    define CV_EVENT_FLAG_CTRLKEY 8 //(8~15)按Ctrl不放事件
    define CV_EVENT_FLAG_SHIFTKEY 16 //(16~31)按Shift不放事件
    define CV_EVENT_FLAG_ALTKEY 32 //(32~39)按Alt不放事件
    看到这些很头大吧,没关系,接下来,我们只讲功能,不讲函数。

代码走起

list1 = []
list2 = []


# 鼠标点击事件
def on_EVENT_LBUTTONDOWN(event, x, y, flags, param):
    if flags == 1:
        if event == cv2.EVENT_MOUSEMOVE:
            # xy = "%d,%d" % (x, y)
            list1.append(x)
            list2.append(y)
            cv2.circle(param, (x, y), 1, (255, 0, 0), thickness=-1)
            # cv2.imshow('img', param)


# 获取坐标位置
def get_coor():
    img = cv2.imread('' + 'WX20201027-160735@2x.png')
    cv2.namedWindow("image")
    cv2.setMouseCallback("image", on_EVENT_LBUTTONDOWN, param=img)
    while 1:
        cv2.imshow("image", img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cv2.destroyAllWindows()
get_coor()
up = sorted(list2)[0]
lower = sorted(list2)[-1]
left = sorted(list1)[0]
right = sorted(list1)[-1]

def select_pic(write_path, image, up, lower, left, right, i):
    image = cv2.imread(image)
    cv2.imwrite(write_path + '{}.jpg'.format(str(i)), image[up:lower, left:right])
select_pic('','WX20201027-160735@2x.png',up, lower, left, right,0)

刚开始图像:

opencv 目标的前景像素点集合内部最大的内切圆盘 opencv选取图像局部区域_opencv


中间处理图像(在原来图像上画出轮廓来,然后按字母q退出):

opencv 目标的前景像素点集合内部最大的内切圆盘 opencv选取图像局部区域_图像识别_02


最终结果:

opencv 目标的前景像素点集合内部最大的内切圆盘 opencv选取图像局部区域_图像识别_03


好了,以上就是整个内容了,有不懂或者需要交流的小伙伴们欢迎留言哦。

(1)、如果您在阅读博客时遇到问题或者不理解的地方,可以联系我,互相交流、互相进步;

(2)、本人业余时间可以承接毕业设计和各种小项目,如系统构建、成立网站、数据挖掘、机器学习、深度学习等。