【DCT】OPENCV python 离散余弦变换问题

majisong 发布于 2016/06/02 14:17
阅读 1K+
收藏 1
因为项目需要,目前在研究《基于离散余弦变换和区域生长的白粉虱图像分割算法》,使用的OPENCV python。


通过对大量病虫害图片的分析发现,采集病虫 害图像时,相机通常聚焦于目标病虫区域,因此, 文章提出 DCT 和区域生长方法分割病虫图像,详 细算法如下。

1)将图像转换到灰度空间,为了消除图像中 孤立的噪声点,并且较好的保护图像的边缘信息, 选择 3(像素)×3(像素)模板,对灰度图像 进 行中值滤波去噪得到 y1,如图 3a 所示;

2)将 y用 8(像素)×8(像素)模板做离散 余弦变换得到 dct1,如图 3b 所示;

3)为了去除图像的细节,保留图像的轮廓信 息,保留 DCT 变换后的低频信号,用低频信号值 的一半作为阈值,截断高频信号,然后进行反离散 余弦变换,重新将图像转换到灰度空间,得到灰度 图像 y2,如图 3c 所示;其中,低频信号 f如式 所示;

− k=0

)

其中,为模板大小,在本文中为 64,x表示模板中像素灰度值 


4)令差值图像 diffy=|y1 - y2|,diffy 灰度化后如 图3d所示; 


我的Python代码:


# -*- coding: utf-8 -*-


# import the necessary packages

import numpy as np

import argparse

import cv2

from matplotlib import pyplot as plt

from matplotlib.colors import Normalize



# 将图像转换到灰度空间

y = cv2.imread('images/beifenshi01.jpg',0)

rows, cols = y.shape[:2]

print rows

print cols


# 为了消除图像中孤立的噪声点,并且较好的保护图像的边缘信息, 

# 选择 3(像素)×3(像素)模板,对灰度图像 y 进 行中值滤波去噪得到 y1

y1 = cv2.medianBlur(y, 3)

print y1


# 将 y1 用 8(像素)×8(像素)模板做离散余弦变换得到 dct1


imf = np.float32(y1)/255.0                      # float conversion/scale

print imf

Trans = cv2.dct(imf)                            # the dct

print Trans

dct1 = np.uint8(Trans) * 255                     # convert back

print dct1


# 为了去除图像的细节,保留图像的轮廓信息,保留 DCT 变换后的低频信号,

# 用低频信号值的一半作为阈值,截断高频信号,然后进行反离散余弦变换,

# 重新将图像转换到灰度空间,得到灰度 图像 y2

imd = dct1[0:8, 0:8]

threshold = np.mean(imd)/2

print threshold



# 像素阈值过滤???

ret, img = cv2.threshold(dct1, threshold, 255, cv2.THRESH_TRUNC)

print img


imgf = np.float32(img) 

print imgf



iTrans = cv2.idct(imgf)
print iTrans
y2 = np.uint8(iTrans)
print y2


# 令差值图像 diffy=|y1 - y2|,diffy 灰度化

diffy = cv2.absdiff(y1, y2)               # 计算两个数组差值的绝对值

print diffy



plt.subplot(231),plt.imshow(y1, cmap = 'gray')

plt.title('Input Image'), plt.xticks([]), plt.yticks([])

plt.subplot(232),plt.imshow(dct1, cmap = 'gray')

plt.title('Image DCT1'), plt.xticks([]), plt.yticks([])

plt.subplot(233),plt.imshow(iTrans, cmap = 'gray')

plt.title('Image iTrans'), plt.xticks([]), plt.yticks([])

plt.subplot(234),plt.imshow(y2, cmap = 'gray')

plt.title('Image y2'), plt.xticks([]), plt.yticks([])

plt.subplot(235),plt.imshow(diffy, cmap = 'gray')
plt.title('Image log_mat'), plt.xticks([]), plt.yticks([])
plt.subplot(236),plt.imshow(diffy, cmap = 'gray')
plt.title('Image diffy'), plt.xticks([]), plt.yticks([])


plt.show()


我的结果:




问题:

1、根据论文描述,将 y1 用 8(像素)×8(像素)模板做离散余弦变换得到 dct1,上述代码实现是否正确?


2、用低频信号值的一半作为阈值,截断高频信号,上述代码是否正确?
加载中
返回顶部
顶部