目录
掩膜方法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:/rat_466-100-100.jpg') #自己截图一张图片就行,要大于下面的坐标点 # 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:/rat_466-100-100.jpg') #自己截图一张图片就行,要大于下面的坐标点 # 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()
如果是两张图叠加:
改为同等大小的图的掩摸部分:
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)
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202702.html原文链接:https://javaforall.net
