发布时间:2025-06-24 18:56:18 作者:北方职教升学中心 阅读量:037
defgenerate_single_mask(self,img:numpy.ndarray,roi:list,threshold:int)->numpy.ndarray:''' 通过手动选择的ROI区域生成单帧图像的水印蒙版 :param img: 单帧图像 :param roi: 手动选择区域坐标 :param threshold: 二值化阈值 :return: 水印蒙版 '''# 区域无效,程序退出iflen(roi)!=4:print('NULL ROI!')sys.exit()# 复制单帧灰度图像ROI内像素点roi_img =numpy.zeros((img.shape[0],img.shape[1]),numpy.uint8)start_x,end_x =int(roi[1]),int(roi[1]+roi[3])start_y,end_y =int(roi[0]),int(roi[0]+roi[2])gray =cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)roi_img[start_x:end_x,start_y:end_y]=gray[start_x:end_x,start_y:end_y]# 阈值分割_,mask =cv2.threshold(roi_img,threshold,255,cv2.THRESH_BINARY)returnmask #通过截取视频中多帧图像生成多张水印蒙版,并通过逻辑与计算生成最终的水印蒙版defgenerate_watermark_mask(self,video_path:str)->numpy.ndarray:''' 截取视频中多帧图像生成多张水印蒙版,通过逻辑与计算生成最终水印蒙版 :param video_path: 视频文件路径 :return: 水印蒙版 '''video =cv2.VideoCapture(video_path)success,frame =video.read()roi =self.select_roi(frame,'select watermark ROI')mask =numpy.ones((frame.shape[0],frame.shape[1]),numpy.uint8)mask.fill(255)step =video.get(cv2.CAP_PROP_FRAME_COUNT)//5index =0whilesuccess:ifindex %step ==0:mask =cv2.bitwise_and(mask,self.generate_single_mask(frame,roi,self.threshold))success,frame =video.read()index +=1video.release()returnself.dilate_mask(mask)#根据手动选择的ROI区域,在单帧图像中生成字幕的蒙版。如果这些条件不满足,可能需要更复杂的图像处理技术,例如图像修复或深度学习去水印方法。
示例2
下面是使用OpenCV去除水印的Python代码示例:
importcv2importnumpy asnp # 读取视频和水印图像video_path ='video_with_watermark.mp4'watermark_path ='watermark.png'cap =cv2.VideoCapture(video_path)# 读取视频的宽、python调用FFMEPG的delogo函数去除水印要使用Python调用FFmpeg的delogo filter去除视频水印,你需要使用subprocess模块运行FFmpeg命令。
(二)电脑——quququ.cn
把图片拖到网站,调整画笔大小,抹除文字就可以p图完成,免费下载就可以了。
defselect_roi(self,img:numpy.ndarray,hint:str)->list:''' 框选水印或字幕位置,SPACE或ENTER键退出 :param img: 显示图片 :return: 框选区域坐标 '''COFF =0.7w,h =int(COFF *img.shape[1]),int(COFF *img.shape[0])resize_img =cv2.resize(img,(w,h))roi =cv2.selectROI(hint,resize_img,False,False)cv2.destroyAllWindows()watermark_roi =[int(roi[0]/COFF),int(roi[1]/COFF),int(roi[2]/COFF),int(roi[3]/COFF)]returnwatermark_roi #对输入的蒙版进行膨胀运算,扩大蒙版的范围defdilate_mask(self,mask:numpy.ndarray)->numpy.ndarray:''' 对蒙版进行膨胀运算 :param mask: 蒙版图片 :return: 膨胀处理后蒙版 '''kernel =numpy.ones((self.kernel_size,self.kernel_size),numpy.uint8)mask =cv2.dilate(mask,kernel)returnmask #根据手动选择的ROI区域,在单帧图像中生成水印或字幕的蒙版。python实战之去除视频水印&字幕,完整代码importosimportsysimportcv2importnumpyfrommoviepy importeditor VIDEO_PATH ='video'OUTPUT_PATH ='output'TEMP_VIDEO ='temp.mp4'classWatermarkRemover():def__init__(self,threshold:int,kernel_size:int):self.threshold =threshold # 阈值分割所用阈值self.kernel_size =kernel_size # 膨胀运算核尺寸#根据用户手动选择的ROI(Region of Interest,感兴趣区域)框选水印或字幕位置。以下是一个简单的示例,演示如何使用OpenCV去除静态图像水印:importcv2importnumpy asnp defremove_watermark(video_path,watermark_path,output_path):# 读取视频和水印图像cap =cv2.VideoCapture(video_path)watermark =cv2.imread(watermark_path,cv2.IMREAD_UNCHANGED)watermark =cv2.cvtColor(watermark,cv2.COLOR_BGR2GRAY)watermark =cv2.GaussianBlur(watermark,(5,5),0)# 获取水印的mask_,mask =cv2.threshold(watermark,1,255,cv2.THRESH_BINARY_INV)whileTrue:ret,frame =cap.read()ifnotret:break# 将水印区域替换为视频帧的背景frame_gray =cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)seamless_clone =cv2.seamlessClone(watermark,frame,mask,center,cv2.NORMAL_CLONE)# 写入去水印后的视频帧output_video.write(seamless_clone)cap.release()output_video.release()# 使用函数去除视频中的水印remove_watermark('input_video.mp4','watermark.png','output_video.mp4')
请注意,这个示例使用了seamlessClone函数,它要求水印区域的中心与背景相匹配,并且假设水印背景是纯色或者与视频背景融合得当。使用opencv-python库来处理视频帧
要在Python中去除视频水印,可以使用opencv-python库来处理视频帧,并结合图像处理技术,如图像修复或者图层混合。
ps:参考自:https://blog.csdn.net/weixin_63253486/article/details/131421022