使用openCV2去除水平条纹

克里斯多夫·海兰斯

样本图片

我是openCV的新手,我想知道是否有办法消除此图像下半部分的周期性条纹。

我看了这篇文章,但不知道发生了什么:使用傅立叶变换消除图像中的周期性噪声

fmw42

这是使用傅立叶变换和使用Python / OpenCV / Numpy进行陷波过滤处理来减轻(减少但不能完全消除)线条的方法。由于输入中的水平线非常接近,因此在傅立叶变换频谱中将存在水平的线性结构。所以我做的是:

  • 读取输入
  • 将平均值填充为2的幂次(以尝试减轻填充不连续引起的振铃)
  • 做DFT
  • 根据幅度计算频谱图像
  • 阈值图像并在中心绘制一条黑色水平线以消除明亮的DC分量
  • 查找亮点(线条)显示的位置。
  • 获取亮点的坐标并在阈值图像上绘制白色水平线以形成遮罩
  • 将蒙版应用于幅度图像
  • 做IDFT
  • 裁切大小并归一化为与原始图像相同的动态范围

输入:

在此处输入图片说明

import numpy as np
import cv2
import math

# read input as grayscale
img = cv2.imread('pattern_lines.png', 0)
hh, ww = img.shape

# get min and max and mean values of img
img_min = np.amin(img)
img_max = np.amax(img)
img_mean = int(np.mean(img))

# pad the image to dimension a power of 2
hhh = math.ceil(math.log2(hh))
hhh = int(math.pow(2,hhh))
www = math.ceil(math.log2(ww))
www = int(math.pow(2,www))
imgp = np.full((hhh,www), img_mean, dtype=np.uint8)
imgp[0:hh, 0:ww] = img

# convert image to floats and do dft saving as complex output
dft = cv2.dft(np.float32(imgp), flags = cv2.DFT_COMPLEX_OUTPUT)

# apply shift of origin from upper left corner to center of image
dft_shift = np.fft.fftshift(dft)

# extract magnitude and phase images
mag, phase = cv2.cartToPolar(dft_shift[:,:,0], dft_shift[:,:,1])

# get spectrum
spec = np.log(mag) / 20
min, max = np.amin(spec, (0,1)), np.amax(spec, (0,1))

# threshold the spectrum to find bright spots
thresh = (255*spec).astype(np.uint8)
thresh = cv2.threshold(thresh, 155, 255, cv2.THRESH_BINARY)[1]

# cover the center rows of thresh with black
yc = hhh // 2
cv2.line(thresh, (0,yc), (www-1,yc), 0, 5)

# get the y coordinates of the bright spots
points = np.column_stack(np.nonzero(thresh))
print(points)

# create mask from spectrum drawing horizontal lines at bright spots
mask = thresh.copy()
for p in points:
    y = p[0]
    cv2.line(mask, (0,y), (www-1,y), 255, 5)

# apply mask to magnitude such that magnitude is made black where mask is white
mag[mask!=0] = 0

# convert new magnitude and old phase into cartesian real and imaginary components
real, imag = cv2.polarToCart(mag, phase)

# combine cartesian components into one complex image
back = cv2.merge([real, imag])

# shift origin from center to upper left corner
back_ishift = np.fft.ifftshift(back)

# do idft saving as complex output
img_back = cv2.idft(back_ishift)

# combine complex components into original image again
img_back = cv2.magnitude(img_back[:,:,0], img_back[:,:,1])

# crop to original size
img_back = img_back[0:hh, 0:ww]

# re-normalize to 8-bits in range of original
min, max = np.amin(img_back, (0,1)), np.amax(img_back, (0,1))
notched = cv2.normalize(img_back, None, alpha=img_min, beta=img_max, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

cv2.imshow("ORIGINAL", img)
cv2.imshow("PADDED", imgp)
cv2.imshow("MAG", mag)
cv2.imshow("PHASE", phase)
cv2.imshow("SPECTRUM", spec)
cv2.imshow("THRESH", thresh)
cv2.imshow("MASK", mask)
cv2.imshow("NOTCHED", notched)
cv2.waitKey(0)
cv2.destroyAllWindows()

# write result to disk
cv2.imwrite("pattern_lines_spectrum.png", (255*spec).clip(0,255).astype(np.uint8))
cv2.imwrite("pattern_lines_thresh.png", thresh)
cv2.imwrite("pattern_lines_mask.png", mask)
cv2.imwrite("pattern_lines_notched.png", notched)


光谱(注意中间的亮点,y = 64和192):

在此处输入图片说明

阈值图像:

在此处输入图片说明

亮点位置:

[[   0 1023]
 [   0 1024]
 [   0 1025]
 [   1 1024]
 [  64 1024]
 [  65 1024]
 [ 191 1024]
 [ 192 1024]
 [ 255 1024]]


面具:

在此处输入图片说明

结果:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在opencv2中使用3D感知

来自分类Dev

在opencv2中使用3D感知

来自分类Dev

python opencv2 findHomography

来自分类Dev

OpenCV2全局函数移至何处?

来自分类Dev

OpenCV2中connectedComponents的统计信息

来自分类Dev

未找到 OpenCV2 createBackgroundSubtractorMOG 属性

来自分类Dev

opencv2 可以使用 cmake 进行构建,但不能使用 CLion 的“构建”功能?

来自分类Dev

使用OpenCV进行条纹布检测

来自分类Dev

无法在Mac OS X上使用python和opencv2编写视频

来自分类Dev

如何使用python opencv2减去两个图像以获取前景对象

来自分类Dev

Django使用opencv2仅将脸部切入图片字段

来自分类Dev

如何使用python opencv2在单个窗口中显示多个视频帧

来自分类Dev

如何使用python opencv2减去两个图像以获取前景对象

来自分类Dev

什么相当于 OpenCV2 中使用 python3 的 cvCreateMat 函数

来自分类Dev

使用 OpenCV 从纸上去除墨迹

来自分类Dev

如何在Python中使用OpenCV2对图像中的一种颜色进行饱和处理?

来自分类Dev

如何在iOS Swift中导入opencv2框架

来自分类Dev

opencv2中的GLCM(灰度共现矩阵)

来自分类Dev

opencv2:圈子检测未检测到明显的

来自分类Dev

opencv2 NameError:未定义名称“输出”

来自分类Dev

如何读取matchTemplate的结果(Python中的OpenCV2)

来自分类Dev

为什么我不能安装python opencv2?

来自分类Dev

opencv2中的GLCM(灰度共现矩阵)

来自分类Dev

将PIL图像转换为OpenCV2图像

来自分类Dev

致命错误:opencv2 / opencv_modules.hpp:没有这样的文件或目录#include“ opencv2 / opencv_modules.hpp”

来自分类Dev

使用OpenCV去除深度图像中的白点

来自分类Dev

调用OpenCV函数时,Numpy和OpenCV2数据类型冲突

来自分类Dev

致命错误:opencv2 / photo.hpp OpenCV 3.0安装

来自分类Dev

OpenCV 3.1.0:/usr/local/include/opencv2/legacy/legacy.hpp无法编译

Related 相关文章

  1. 1

    在opencv2中使用3D感知

  2. 2

    在opencv2中使用3D感知

  3. 3

    python opencv2 findHomography

  4. 4

    OpenCV2全局函数移至何处?

  5. 5

    OpenCV2中connectedComponents的统计信息

  6. 6

    未找到 OpenCV2 createBackgroundSubtractorMOG 属性

  7. 7

    opencv2 可以使用 cmake 进行构建,但不能使用 CLion 的“构建”功能?

  8. 8

    使用OpenCV进行条纹布检测

  9. 9

    无法在Mac OS X上使用python和opencv2编写视频

  10. 10

    如何使用python opencv2减去两个图像以获取前景对象

  11. 11

    Django使用opencv2仅将脸部切入图片字段

  12. 12

    如何使用python opencv2在单个窗口中显示多个视频帧

  13. 13

    如何使用python opencv2减去两个图像以获取前景对象

  14. 14

    什么相当于 OpenCV2 中使用 python3 的 cvCreateMat 函数

  15. 15

    使用 OpenCV 从纸上去除墨迹

  16. 16

    如何在Python中使用OpenCV2对图像中的一种颜色进行饱和处理?

  17. 17

    如何在iOS Swift中导入opencv2框架

  18. 18

    opencv2中的GLCM(灰度共现矩阵)

  19. 19

    opencv2:圈子检测未检测到明显的

  20. 20

    opencv2 NameError:未定义名称“输出”

  21. 21

    如何读取matchTemplate的结果(Python中的OpenCV2)

  22. 22

    为什么我不能安装python opencv2?

  23. 23

    opencv2中的GLCM(灰度共现矩阵)

  24. 24

    将PIL图像转换为OpenCV2图像

  25. 25

    致命错误:opencv2 / opencv_modules.hpp:没有这样的文件或目录#include“ opencv2 / opencv_modules.hpp”

  26. 26

    使用OpenCV去除深度图像中的白点

  27. 27

    调用OpenCV函数时,Numpy和OpenCV2数据类型冲突

  28. 28

    致命错误:opencv2 / photo.hpp OpenCV 3.0安装

  29. 29

    OpenCV 3.1.0:/usr/local/include/opencv2/legacy/legacy.hpp无法编译

热门标签

归档