前言
 
 之前的文章中,介绍了如何构建Java工程和Java Web工程,本文将简单介绍对傅里叶变换的理解,以及使用opencv实现盲水印。关于傅里叶变换,有篇博文介绍的很详细,链接地址为:看了此文你还不了解傅里叶变换,你就过来掐死我吧!。 
 
对图像傅里叶变换的理解
 
 对图像进行傅里叶变换,起始是一个二维离散傅里叶变换,图像的频率是指图像灰度变换的强烈程度,将二维图像由空间域变为频域后,图像上的每个点的值都变成了复数,也就是所谓的复频域,通过复数的实部和虚部,可以计算出幅值和相位,计算幅值即对复数取模值,将取模值后的矩阵显示出来,即为其频谱图。但是问题来了,复数取模后,数字有可能变的很大,远大于255,如果数据超过255,则在显示图像的时候会都当做255来处理,图像就成了全白色。因此,一般会对模值再取对数,在在0~255的范围内进行归一化,这样才能够准确的反映到图像上,发现数据之间的差别,区分高频和低频分量,这也是进行傅里叶变换的意义。 
 
opencv实现盲水印
 
 废话不多说,先上代码。 
 
public class DFTUtil {
	private static List<Mat> planes;
	private static Mat complexImage;
	
	private DFTUtil(){}
	private static final DFTUtil dftUtil = new DFTUtil();
	public static DFTUtil getInstance () {
		planes = new ArrayList<>();
		complexImage = new Mat();
		return dftUtil;
	}
	
	public Mat transformImage(Mat image) {
		// planes数组中存的通道数若开始不为空,需清空.
		if (!planes.isEmpty()) {
			planes.clear();
		}
		// optimize the dimension of the loaded image
		Mat padded = this.optimizeImageDim(image);
		padded.convertTo(padded, CvType.CV_32F);
		// prepare the image planes to obtain the complex image
		planes.add(padded);
		planes.add(Mat.zeros(padded.size
 
                   
                   
                   
                   本文介绍了使用OpenCV通过傅里叶变换实现盲水印的过程,包括对图像傅里叶变换的理解,详细阐述了如何在图像中嵌入水印并展示最终效果。
本文介绍了使用OpenCV通过傅里叶变换实现盲水印的过程,包括对图像傅里叶变换的理解,详细阐述了如何在图像中嵌入水印并展示最终效果。
           最低0.47元/天 解锁文章
最低0.47元/天 解锁文章
                           
                       
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   2065
					2065
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            