python opencv 快速均值平滑
import cv2 import numpy as np from datetime import datetime from scipy import signal #二维离散卷积运算 import math def printWithdate(str): time2 = datetime.now() time2a = time2.strftime("%Y-%m-%d %H:%M:%S") print(time2a+' '+str) #python opencv均值平滑 def integral(image): ''' 代码实现积分运算(展示原理)--即任意一个位置的积分等于该位置左上角所有值的和 ''' rows,cols = image.shape #行积分运算 inteImgC=np.zeros((rows,cols),np.float32) for r in range(rows): for c in range(cols): if c == 0: inteImgC[r][c] = image[r][c] else: inteImgC[r][c] = inteImgC[r][c-1]+image[r][c] #列积分运算 inteImg = np.zeros(image.shape,np.float32) for c in range(cols): for r in range(rows): if r==0: inteImg[r][c] = inteImgC[r][c] else: inteImg[r][c] = inteImg[r-1][c]+inteImgC[r][c] #上边盒左边进行补零 inteImg_0 = np.zeros((rows+1,cols+1),np.float32) inteImg_0[1:rows+1,1:cols+1] = inteImg return inteImg_0 def fastMeanblur(img,winSize,borderType = cv2.BORDER_DEFAULT): ''' 代码实现均值平滑,展示原理。 ''' halfH = int((winSize[0]-1)/2) halfW = int((winSize[1]-1)/2) ratio = 1.0/(winSize[0]*winSize[1]) #边界扩充 padImg = cv2.copyMakeBorder(img,halfH,halfH,halfW,halfW,borderType) #图像积分 padImg = integral(padImg) #图像高,宽 rows,cols = img.shape #均值滤波后的结果 meanBlurImg = np.zeros(img.shape,np.float32) r,c = 0,0 for h in range(halfH,halfH+rows,1): for w in range(halfW,halfW+cols,1): meanBlurImg[r][c]=(padImg[h+halfH+1][w+halfW+1] +padImg[h-halfH][w-halfW] -padImg[h+halfH+1][w-halfW] -padImg[h-halfH][w+halfW+1])*ratio c+=1 r+=1 c=0 return meanBlurImg if __name__=="__main__": printWithdate("hello") try: #异常捕捉 ,python 捕捉 imread路径错误 img = cv2.imread(r'dayan.png',cv2.IMREAD_GRAYSCALE) #不会抛出异常,返回none except FileNotFoundError: print('没有找到文件') except IOError as e: print('img read error') except Exception as e: print('未知错误 error') if img is None: print("img is None,程序结束") quit() #程序直接退出不执行后续代码 # cv2.imshow('img',img) # cv2.waitKey(0) # cv2.destroyAllWindows() #图像的积分后,通过定义函数fastMeanBlur来实现均值平滑,其中image是输 #入矩阵,winSize为平滑窗口尺寸,宽、高均为奇数,borderType为边界扩充类型。如果 #在图像的边界进行的处理是补零操作,那么随着窗口的增大,平滑后黑色边界会越来越 #明显,所以在进行均值平滑处理时,比较理想的边界扩充类型是镜像扩充 meanImg = fastMeanblur(img,winSize=(7,7)) # 图像进行灰度级显示 meanImg = np.round(meanImg) meanImg = meanImg.astype(np.uint8) #卷积结果的数据类型是浮点型,假设输入的图像是8位图,进行 #高斯卷积后,需要将结果用命令asty pe(numpy.uint8)进行数据类型转换,从而进行灰 #度级显示,否则用imshow显示时为黑色 cv2.imshow("GaussBlur",meanImg) cv2.waitKey(0) cv2.destroyAllWindows() # new_img = np.zeros(img.shape,np.uint8) # H,W = img.shape # for x in range(H): # for y in range(W): # if img[x][y]<245: # # new_img[x][y] = 0 #0 黑色 # else: # new_img[x][y] = 255 # 亮,白色 # cv2.imwrite('lrc_2.jpg',new_img) # cv2.imshow('a',new_img) # cv2.waitKey(0) # cv2.destroyAllWindows()
欢迎讨论,相互学习。
cdtxw@foxmail.com
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
2023-03-22 c#时间相减时分秒
2022-03-22 c#正则表达式提取字符串--以SLA开头,$结束的信息