图像处理20210808
降噪后出现边缘“毛刺”问题中值滤波使用opencv中的medianBlur解决方案:
1medianBlur_new_img = cv.medianBlur(new_img, 3)
可以优化之前的降噪效果:
效果几乎达到理想状态(只有四周边界有些许噪声残留)
探究中值滤波起了多大作用尝试直接使用中值滤波对噪声图进行降噪:
1234567891011121314# python3.8# utf-8import cv2 as cvdef main(address): img = cv.imread(address, 1) new_img = cv.medianBlur(img, 3) cv.imwrite('denoised_' + address, new_img)if __name__ == '__main__': img_address = 'img_noise.png' main(img_address)
得到结果:
虽然效果略微比上面差一点,但是几乎接近。
那么从这个结果看,可以看 ...
图像处理20210801
增加噪声将噪声个数增加到10%(实验中具体为4000个)
12345678910111213141516171819import cv2 as cvimport numpy as npimport randomimg = cv.imread("img.png", 1)(rows, cols, chn) = img.shapecv.imshow("img.png", img)# 加噪声for i in range(4000): x = np.random.randint(0, rows) y = np.random.randint(0, cols) img[x, y, :] = random.randint(0, 255)cv.imshow("noise", img)cv.imwrite("img_noise.png", img)cv.waitKey()cv.destroyAllWindows()
得到:
降噪降噪结果用上周的方法尝试,得到如下结果:
可以看到结果中仍然有部分噪声未被 ...
图像处理20210725
优化算法程序结构合理性与时间复杂度机械地将denoise12和denoise7合并在一起,虽然达到了效果,但是程序结构上显然不合理,时间复杂度也大大加重。
程序结构因为两种降噪算法在大部分的操作上是相似的,甚至是相同的,那么很简单地想到将其有机复合,简而言之就是精简相同或类似的步骤,并将关键处理步骤穿插在一起。
这样的方法很容易想到,但是修改起来费时费力,容易出bug。因为一开始编写程序时,由于没有全面学透python的原因,没有使用面向对象的思想,而是简单使用了面向过程的写法,尽管使用了结构体的思想,但程序看起来还是不够有条理,而且后期难以管理。
所以我尝试使用C++给出更好的解决方案(CPicture.h):
123456789101112131415161718192021222324252627282930313233343536373839404142#pragma once#include <opencv2/opencv.hpp>#include <string>#include <vector>#include <numeric& ...
图像处理20210718
加强噪声强度实际的测试图大小为200+ X 200+,那么这次测试将人为加入2000个噪声点,也就是加到5%的噪声密度,如下图:
原图是这样:这样的噪声密度就有点恐怖了,但还是硬着头皮用denoise11的程序跑了一下(多尺度指数为1),结果如下:结果很显然,处理之后的图仍然留下来许多噪声,但至少稍微能看了
解决方案再次降噪将处理图用denoise11再次降噪,结果如下:结果确实是几乎将仍留下的单个的噪声点去除了,但仍然没有达到较为理想的状态
利用多尺度结果仍然不理想,且因为其中操作复杂,很难分析原因
使用旧方法再次尝试利用旧的方法(比较两种划分)来去除噪声,处理d11,结果如下:可以看到,虽然图像的边缘部分略显粗糙,但还是离理想情况更近了一步
先旧后新将两种方法结合在一起,封装成一个函数:
1234567# python3.8# utf-8from denoise12 import *if __name__ == '__main__': denoise('img_noise.png', 1, 1)
可得到相对不错的效果:
图像处理20210711
多方面的降噪检测多尺度降噪为了方便进行多尺度降噪,我将降噪函数的接口进行修改,最终封装在denoise.py中。
其中,对外开放的函数是:denoise(img_address, color=0, k=1)
img_address:图像地址
color:决定图片以何种形式读入(如BGR/灰度),默认为灰度
k:多尺度指数(决定缩小几倍),默认为1
代码示例:
1234567# python3.8# utf-8from denoise import *if __name__ == '__main__': denoise('img_noise.png', 1, 2)
存在的问题该算法将抽离出的小图直接进行修改,并打回原图,而在边缘部分,因缩小而造成的信息损失会使修改不一定合理,如下图所示:
可以看到在噪声被去除的同时,边缘部分会变得不平滑,反而产生一些噪声,这一点,在下面的“降噪合理性”中,也被证明。
所以这也应证了我一开始的猜想:不应该对小图直接修改,而是应该将小图中被标记的噪声也同样标记到大图中,统一处理。
降噪合理性这部分,我同样做 ...
图像处理20210606
新的去噪方法选取3X3噪声点中心点为C,周围八个点分别是A1~A8
处理中心点C对九个点进行不考虑位置的区域划分,再去掉中心点C,对其余八个点进行不考虑位置的划分,若两次划分有明显的变化,那么说明中心点为噪声点。
如果中心点C为噪声,那么就在八邻域中找到与中心点最为接近的点的值,赋给中心点C
处理八邻域将九个点全排列,分成两个区域,然后搜索每个点,如果该点没有与所在区域的其他点相邻,那么就将它的噪声指数加一
效果
下面尝试用opencv中的canny算子检测噪声图和处理图(去噪后)的效果:
代码示例123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 ...
图像处理20210530
探究降噪合理性区分度合理的降噪结果应该是本身区分度大的地方更大,让本身区分度小的地方更小
因此我们拿一张原图,跟降噪后的的图片进行试验(这里就不给出图片样例了)
但是可以看一下结果:
代码如下:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899# python3.8# utf-8import cv2 as cvimport matplotlib.pyplot as plt# 考虑位置def division(_8area): result = [0] * 8 p = [_8area[0][0], _8area[0][1], _8area[0][2], _8area[1][2], _8area[2][2], _8area[2][1], ...
图像处理20210523
效果
可以看到,大部分白色噪声都被去除,只有部分连块的“较大”噪声没有去除。不过我们暂时可以不用管它,因为只需要多次利用该算法(如果遇到仍无法解决的情况,那么再附加“缩小二分之一”图像的检测就可以了)
考虑该算法是否合理这里考虑的条件仅为是否会对直线检测造成影响(直线检测算法暂时利用opencv中的canny算子)
下面是降噪前和降噪后的样例:
降噪前
降噪后
旧算法降噪后
首先新算法降噪前后,对canny检测几乎没有影响,甚至还有一定程度的提升
但旧的算法会使边缘变得不平滑,这体现出了新算法的优势之一
噪声条件更加恶劣噪声值也为随机时
可以看出效果不错
代码123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 ...