数字图像处理三python实现-1

数字图像处理三-1(平滑空间滤波器)

添加3000点噪声

import cv2
import numpy as np
import matplotlib as plt

def addNoise(imgPath):
    
    # 读取图像,cv2以BGR读取彩色图像
    img = cv2.imread(imgPath)
    
    # 随机添加噪声
    noiseImg = img
    row, col, chn = noiseImg.shape    # 获取图像大小
    for i in range(3000):
        x = np.random.randint(0, row) # 随机整数获取
        y = np.random.randint(0, col)
        noiseImg[x, y, :] = 255
    
    return noiseImg

noiseImg = addNoise("cat.JPG")

# 显示图像
cv2.imshow("noiseImg", noiseImg)
cv2.waitKey(0)
cv2.destroyAllWindows()

# 保存图像
cv2.imwrite("catNoiseImg.jpg", noiseImg)
catNoiseImg.jpg

盒状滤波器

cv2.blur(img, (3, 3)),模糊核大小为3 * 3,模糊核越大图像会越模糊

import cv2
import numpy as np
import matplotlib.pylab as plt

# 读取噪声图像
img = cv2.imread("catNoiseImg.jpg")
#img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # bgr转为rgb,因为matplotlib显示方式为rgb

# 盒状滤波器
mean3Img = cv2.blur(img, (3, 3)) # 模糊核大小为3*3
mean5Img = cv2.blur(img, (5, 5)) # 模糊核大小为5*5
mean10Img = cv2.blur(img, (10, 10)) # 模糊核大小为10*10
# 显示图像
cv2.imshow("noiseImg", img)
cv2.imshow("cv2_blur_3", mean3Img)
cv2.imshow("cv2_blur_5", mean5Img)
cv2.imshow("cv2_blur_10", mean10Img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite("cv2_blur_3.jpg", mean3Img)
cv2.imwrite("cv2_blur_5.jpg", mean5Img)
cv2.imwrite("cv2_blur_10.jpg", mean10Img)

'''
# plt显示图像
titles = ['noiseImg','blur3*3','blur5*5','blur10*10']
imgs = [img,mean3Img,mean5Img,mean10Img]
for i in range(4):
    plt.subplot(2,2,i+1)
    plt.imshow(imgs[i])
    plt.title(titles[i])
    plt.xticks([])
    plt.yticks([])
plt.savefig('cv2_blur.png')    # plt保存图像
plt.show()
'''
cv2_blur_3.jpg
cv2_blur_5.jpg
cv2_blur_10.jpg
# 只能奇数
import cv2
import numpy as np
import matplotlib as plt

def myMeanFilter(imgPath, len):
    
    # 读取图像及其大小、bgr
    img = cv2.imread(imgPath)
    rows, cols, channels = img.shape
    padNum = int((len - 1) / 2) # 填充长度
    b, g, r = cv2.split(img) # 分离bgr
    
    # bgr分别填充
    bPadImg = np.zeros((rows + 2 * padNum, cols + 2 * padNum))
    bPadImg[padNum:padNum + rows, padNum:padNum + cols] = b # 中间复制
    gPadImg = np.zeros((rows + 2 * padNum, cols + 2 * padNum))
    gPadImg[padNum:padNum + rows, padNum:padNum + cols] = g
    rPadImg = np.zeros((rows + 2 * padNum, cols + 2 * padNum))
    rPadImg[padNum:padNum + rows, padNum:padNum + cols] = r
    
    # 滤波器
    meanFilter = np.ones((len, len))
    meanFilter = meanFilter/(len*len)
    
    for i in range(rows):
        for j in range(cols):
            b[i, j] = np.sum(bPadImg[i:i+len, j:j+len] * meanFilter)
            g[i, j] = np.sum(gPadImg[i:i+len, j:j+len] * meanFilter)
            r[i, j] = np.sum(rPadImg[i:i+len, j:j+len] * meanFilter)
    
    res = cv2.merge((b,g,r))
    return res

imgPath = "catNoiseImg.jpg"
img = cv2.imread(imgPath)
myMean3Img = myMeanFilter(imgPath, 3)
myMean5Img = myMeanFilter(imgPath, 5)
myMean9Img = myMeanFilter(imgPath, 9)
# 显示图像
cv2.imshow("noiseImg",img)
cv2.imshow("my_mean_blur_3", myMean3Img)
cv2.imshow("my_mean_blur_5", myMean5Img)
cv2.imshow("my_mean_blur_9", myMean9Img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite("my_mean_blur_3.jpg", myMean3Img)
cv2.imwrite("my_mean_blur_5.jpg", myMean5Img)
cv2.imwrite("my_mean_blur_9.jpg", myMean9Img)
my_mean_blur_3.jpg
my_mean_blur_5.jpg
my_mean_blur_9.jpg

中值滤波器

cv2.medianBlur(img, 7),size必须为奇数,表示模糊核的长度,越大越模糊

import cv2
import numpy as np
import matplotlib.pylab as plt

# 读取噪声图像
img = cv2.imread("catNoiseImg.jpg")

# 中值滤波器
median3Img = cv2.medianBlur(img, 3)
median5Img = cv2.medianBlur(img, 5)
median9Img = cv2.medianBlur(img, 9)
# 显示图像
cv2.imshow("noiseImg", img)
cv2.imshow("cv2_median_blur_3", median3Img)
cv2.imshow("cv2_median_blur_5", median5Img)
cv2.imshow("cv2_median_blur_9", median9Img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite("cv2_median_blur_3.jpg", median3Img)
cv2.imwrite("cv2_median_blur_5.jpg", median5Img)
cv2.imwrite("cv2_median_blur_9.jpg", median9Img)
cv2_median_blur_3.jpg
cv2_median_blur_5.jpg
cv2_median_blur_9.jpg
import cv2
import numpy as np
import matplotlib.pylab as plt

def myMedianBlur(imgPath, len):
    img = cv2.imread(imgPath)
    rows, cols, channels = img.shape
    padNum = int((len - 1) / 2) # 填充长度
    b, g, r = cv2.split(img) # 分离bgr
    bPadImg = np.zeros((rows + 2 * padNum, cols + 2 * padNum))
    bPadImg[padNum:padNum + rows, padNum:padNum + cols] = b # 中间复制
    gPadImg = np.zeros((rows + 2 * padNum, cols + 2 * padNum))
    gPadImg[padNum:padNum + rows, padNum:padNum + cols] = g
    rPadImg = np.zeros((rows + 2 * padNum, cols + 2 * padNum))
    rPadImg[padNum:padNum + rows, padNum:padNum + cols] = r
    for i in range(rows):
        for j in range(cols):
            b[i, j] = np.median(bPadImg[i:i+len, j:j+len]) # np中矩阵寻找中位数
            g[i, j] = np.median(gPadImg[i:i+len, j:j+len])
            r[i, j] = np.median(rPadImg[i:i+len, j:j+len])
    res = cv2.merge((b,g,r))
    return res

imgPath = "catNoiseImg.jpg"
img = cv2.imread(imgPath)
myMedian3Img = myMedianBlur(imgPath, 3)
myMedian5Img = myMedianBlur(imgPath, 5)
myMedian9Img = myMedianBlur(imgPath, 9)
# 显示图像
cv2.imshow("noiseImg", img)
cv2.imshow("my_median_blur_3", myMedian3Img)
cv2.imshow("my_median_blur_5", myMedian5Img)
cv2.imshow("my_median_blur_9", myMedian9Img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite("my_median_blur_3.jpg", myMedian3Img)
cv2.imwrite("my_median_blur_5.jpg", myMedian5Img)
cv2.imwrite("my_median_blur_9.jpg", myMedian9Img)
my_median_blur_3.jpg
my_median_blur_5.jpg
my_median_blur_9.jpg

高斯滤波器

cv2.GaussianBlur(img,(5,5),sigmax,sigmay)

import cv2
import numpy as np
import matplotlib as plt

# 读取噪声图像
img = cv2.imread("catNoiseImg.jpg")

# 高斯滤波器
Gaussian3Img = cv2.GaussianBlur(img, (3,3), 0, 0)
Gaussian5Img = cv2.GaussianBlur(img, (5,5), 0, 0)
# 显示图像
cv2.imshow("noiseImg", img)
cv2.imshow("cv2_gaussian_blur_3", Gaussian3Img)
cv2.imshow("cv2_ganssian_blur_5", Gaussian5Img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite("cv2_gaussian_blur_3.jpg", Gaussian3Img)
cv2.imwrite("cv2_gaussian_blur_5.jpg", Gaussian5Img)
cv2_gaussian_blur_5.jpg
cv2_gaussian_blur_3.jpg
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352