python opencv多边形掩膜 掩码

目录

掩膜方法1:

提取掩摸方法2:提取掩膜内的图片:其余是0

改变掩摸内容:

掩摸反向选择操作,比如改变背景:

python画多边形:

多边形ROI,主要利用鼠标交互进行绘制:

多边形ROI实例,保存csv


掩膜方法1:

坐标点需要顺时针顺序。

img = cv2.imread(r'd:/nv1.jpg')
shape = img.shape
points_704 = np.array([[80, 130], [140, 130], [170, 50], [225, 50]])

img_origin = img.copy()
cv2.fillConvexPoly(img, points_704, 1)
bitwisexor = cv2.bitwise_xor(img, img_origin)

cv2.imshow("asdf",bitwisexor)
cv2.waitKey(0)

提取掩摸方法2:提取掩膜内的图片:其余是0

# coding=utf-8
import numpy as np

import cv2

image = cv2.imread("d:/bgs.jpg")


b  = np.array([[[100,100],  [250,100], [300,220],[100,230]]], dtype = np.int32)

im = np.zeros(image.shape[:2], dtype = "uint8")
cv2.polylines(im, b, 1, 255)
cv2.fillPoly(im, b, 255)

mask = im
cv2.imshow("Mask", mask)
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask to Image", masked)
cv2.waitKey(0)

改变掩摸内容:

# -*- coding: utf-8 -*-
import os
import numpy as np
import cv2

import cv2
import numpy as np


mask_threth = 50

img = cv2.imread('d:/rat20191114_466-100-100.jpg') #自己qq截图一张图片就行,要大于下面的坐标点

# binary mask
coordinates = []
coordinate1 = [[[40, 135], [168,132], [264,330], [2,328]]]
coordinate2 = [[[300, 300], [600,300], [600,600], [300,600]]]
coordinate1 = np.array(coordinate1)
coordinate2 = np.array(coordinate2)
coordinates.append(coordinate1)
coordinates.append(coordinate2)
mask = np.zeros(img.shape[:2], dtype=np.int8)
mask = cv2.fillPoly(mask, coordinates, 255)
cv2.imwrite('./mask1.png', mask)

bbox_mask = mask
color_mask = np.array([0, 0, 255], dtype=np.uint8)
bbox_mask = bbox_mask.astype(np.bool)
# cv2.imwrite('./bbox_mask.png', bbox_mask)

img[bbox_mask] =  color_mask * 0.5
cv2.imshow("sadf",img)
cv2.waitKey()

掩摸反向选择操作,比如改变背景:

# -*- coding: utf-8 -*-
import os
import numpy as np
import cv2

import cv2
import numpy as np


mask_threth = 50

img = cv2.imread('d:/rat20191114_466-100-100.jpg') #自己qq截图一张图片就行,要大于下面的坐标点

# binary mask
coordinates = []
coordinate1 = [[[40, 135], [168,132], [264,330], [2,328]]]
coordinate2 = [[[300, 300], [600,300], [600,600], [300,600]]]
coordinate1 = np.array(coordinate1)
coordinate2 = np.array(coordinate2)
coordinates.append(coordinate1)
coordinates.append(coordinate2)
bbox_mask = np.zeros(img.shape[:2], dtype=np.int8)
bbox_mask[::]=255
bbox_mask = cv2.fillPoly(bbox_mask, coordinates, 0)
cv2.imshow("mask",bbox_mask)

color_mask = np.array([0, 0, 255], dtype=np.uint8)* 0.5
bbox_mask = bbox_mask.astype(np.bool)

img[bbox_mask] =[0, 0, 255]#  color_mask
cv2.imshow("sadf",img)
cv2.waitKey()

如果是两张图叠加:

bbox_mask = bbox_mask.astype(np.bool)
后面的赋值颜色:img[bbox_mask] =[0, 0, 255]#  color_mask

改为同等大小的图的掩摸部分:

src2[bbox_mask] = img_o[bbox_mask]

python画多边形:

注意:a为多边形坐标点,需要是三维的,比如[1,4,2]

外面的是list或者numpy矩阵都支持。

    import numpy as np
    import cv2
    a = np.array([[10,10], [50,10], [100,100], [10,80]], dtype = np.int32)
    b = np.array([[[50,100], [200,230], [150,200], [150,220]]], dtype = np.int32)
    print(a.shape)
    im = np.zeros([240, 320,3], dtype = np.uint8)
    cv2.polylines(im, [a], 1, (0,0,255))
    cv2.fillPoly(im, b,  (0,255,255))

    cv2.imshow("image",im)
    cv2.waitKey()

多边形ROI,主要利用鼠标交互进行绘制:

1. 单击左键,选择多边形的点;

2. 单击右键,删除最近一次选择的点;

3. 单击中键,确定ROI区域并可视化。

4. 按”S“键,将多边形ROI区域的点保存到本地”config.pkl"文件中。

话不多说,以下是核心代码

import cv2

  

import numpy as np

import joblib

  

pts = []  # 用于存放点

  

  

# 统一的:mouse callback function

def draw_roi(event, x, y, flags, param):

    img2 = img.copy()

  

    if event == cv2.EVENT_LBUTTONDOWN:  # 左键点击,选择点

        pts.append((x, y))

  

    if event == cv2.EVENT_RBUTTONDOWN:  # 右键点击,取消最近一次选择的点

        pts.pop()

  

    if event == cv2.EVENT_MBUTTONDOWN:  # 中键绘制轮廓

        mask = np.zeros(img.shape, np.uint8)

        points = np.array(pts, np.int32)

        points = points.reshape((-1, 1, 2))

        # 画多边形

        mask = cv2.polylines(mask, [points], True, (255, 255, 255), 2)

        mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROI

        mask3 = cv2.fillPoly(mask.copy(), [points], (0, 255, 0))  # 用于 显示在桌面的图像

  

        show_image = cv2.addWeighted(src1=img, alpha=0.8, src2=mask3, beta=0.2, gamma=0)

  

        cv2.imshow("mask", mask2)

        cv2.imshow("show_img", show_image)

  

        ROI = cv2.bitwise_and(mask2, img)

        cv2.imshow("ROI", ROI)

        cv2.waitKey(0)

  

    if len(pts) > 0:

        # 将pts中的最后一点画出来

        cv2.circle(img2, pts[-1], 3, (0, 0, 255), -1)

  

    if len(pts) > 1:

        # 画线

        for i in range(len(pts) - 1):

            cv2.circle(img2, pts[i], 5, (0, 0, 255), -1)  # x ,y 为鼠标点击地方的坐标

            cv2.line(img=img2, pt1=pts[i], pt2=pts[i + 1], color=(255, 0, 0), thickness=2)

  

    cv2.imshow('image', img2)

  

  

# 创建图像与窗口并将窗口与回调函数绑定

img = cv2.imread("111.jpg")

  

cv2.namedWindow('image')

cv2.setMouseCallback('image', draw_roi)

print("[INFO] 单击左键:选择点,单击右键:删除上一次选择的点,单击中键:确定ROI区域")

print("[INFO] 按‘S'确定选择区域并保存")

print("[INFO] 按 ESC 退出")

  

while True:

    key = cv2.waitKey(1) & 0xFF

    if key == 27:

        break

    if key == ord("s"):

        saved_data = {

            "ROI": pts

        }

        joblib.dump(value=saved_data, filename="config.pkl")

        print("[INFO] ROI坐标已保存到本地.")

        break

cv2.destroyAllWindows()

绘制不规则多边形:

然后按鼠标中

多边形ROI实例,保存csv

import cv2
import numpy as np
import pandas as pd
from skimage import io

from get_point import cross_point,GetCrossPoint,Point,Line
label_file='S1.csv'

df_label = pd.read_csv(label_file)

def get_temper(value):
    return value/ 100 - 273.15

aaa=[]

import pandas as pd

headers = ['file_name',  'max_temp', 'min_temp', 'mean_temp','len']

datas=[]
max_temp=0
min_temp=100
for index_a, data in df_label.iterrows():

    id_path="S1/"+ data["ID"]+".tiff"

    img_path="S1/"+ data["ID"].replace("R","N")+".jpg"

    img_show=cv2.imread(img_path)

    img_tif = io.imread(id_path)

    end=73

    for ai in range(73):
        p_x = data['x' + str(ai)]
        p_y = data['y' + str(ai)]
        if np.isnan(p_x) or np.isnan(p_y):
            if ai == 43:
                end = 42
            break
    print("end",end)

    pts = []
    pts_right=[]

    for ai in range(end):
        p_x=data['x'+str(ai)]
        p_y=data['y'+str(ai)]
        if np.isnan(p_x) or np.isnan(p_y):
            continue
        p_x=int(min(img_show.shape[1]-1,max(0,p_x)))
        p_y=int(min(img_show.shape[0]-1,max(0,p_y)))

        font = cv2.FONT_HERSHEY_SIMPLEX
        if end==42:
            if ai > 27 and ai < 36:  # mouse
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai ), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                # print(ai,p_x, p_y, round(img_tif[int(p_y)][int(p_x)] , 2))
            elif ai>16 and ai<22: #nose
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
            elif ai>=39 and ai<=44: #forehead
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
            elif (ai >= 10 and ai <= 11) or ( ai>37 and ai<=38):  # xiaba
                # continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
            else:
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
        elif end==73:
            if ai > 27 and ai < 36:  #nose
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai ), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                # print(ai,p_x, p_y, round(img_tif[int(p_y)][int(p_x)] , 2))
                pts.append([p_x, p_y])
            elif ai >= 68 and ai <= 72:  # forehead
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
            elif (ai >= 6 and ai <= 10) or(ai==57):  # xiaba
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
            else:
                continue
                cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
                cv2.putText(img_show, str(ai), (p_x, p_y + 5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
                pts.append([p_x, p_y])
            # if ai>47 and ai<68:
            #     cv2.circle(img_show, (int(p_x), int(p_y)), 2, color=(0, 255, 0))
            #     cv2.putText(img_show, str(ai + 1), (p_x,p_y+5), font, 0.2, (0, 0, 255), 1, cv2.LINE_AA)
            #     # print(ai,p_x, p_y, round(img_tif[int(p_y)][int(p_x)] , 2))
            #     pts.append([p_x, p_y])

    if len(pts)>2:
        mask = np.zeros(img_tif.shape, np.uint8)

        points = np.array(pts, np.int32)

        points = points.reshape((-1, 1, 2))

        mask2 = cv2.fillPoly(mask.copy(), [points], (255, 255, 255))  # 用于求 ROI

        ROI=img_tif[mask2 > 0]

        b = np.sum(ROI)

        max_v=np.around(get_temper(max(ROI)),2)
        min_v=np.around(get_temper(min(ROI)),2)
        avg_v=np.around(get_temper(b/len(ROI)),2)

        # print("max",max_v,"min",min_v,"avg",avg_v)

        max_temp=max(max_temp,max_v)
        min_temp=min(min_temp,min_v)
        aaa.append(get_temper(b/len(ROI)))

        gdp1 = pd.Series([img_path, max_v, min_v, avg_v, len(ROI)],index=headers)

        datas.append(gdp1)

        cv2.imshow("ROI", mask2)

    cv2.imshow("img_show", img_show)
    cv2.waitKey(1)


gdp4=pd.concat(datas,axis=1).T

gdp4.to_csv("xiaba.csv",index=False)

node_data=np.asarray(aaa)

noze_avg= np.sum(node_data)/len(node_data)
print(noze_avg,len(node_data),"max",max_temp,"min",min_temp)

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值