数字图像隐藏图像的两种算法及实现代码

2023-10-31

数字图像

  • 二值图像
    也叫单色图像,是将每个像素点存放在一个bit空间(值为0或者1)的图像,也就是说每个像素“非黑即白”,主要用于图像形态学的研究。
  • 8位灰度图像
    每个像素存放在一个byte空间(8位,0-255:0表示最暗色黑色,255表示最亮色白色)。8位灰度图像可以看成是一系列1位“位平面”的叠加。
  • 彩色图像
    最常用的是24位全彩色,图像中的每个像素占据3个byte的空间,分别表示RGB3个通道,总共可以显示16,777,216(256的3次方)种颜色,色彩显示区域相当广泛,但相应的存储空间要求很高。

八位位平面

这里8位灰度图像提到的位平面概念如图:

这里写图片描述

像素值的取值范围是【0,255】,刚好可以用八位二进制来表示,每一位代表一张位平面图。

比如一幅图像在坐标【15,33】像素值是233,那么其二进制表示为11101001,因此
其第七位平面在坐标【15,33】的值为1,
其第六位平面在坐标【15,33】的值为1,
其第五位平面在坐标【15,33】的值为1,
其第四位平面在坐标【15,33】的值为0,
其第三位平面在坐标【15,33】的值为1,
其第二位平面在坐标【15,33】的值为0,
其第一位平面在坐标【15,33】的值为0,
其第零位平面在坐标【15,33】的值为1,

叠加八个位平面的算法也不难想,应该是:

1*2^7 + 1*2^6 + 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 233

从这也可以看出,第七位平面的权值最大的,为128。

权值

权值越大,该位平面的数值能影响到原像素值的因素也越大。因此,第七位平面所能保存的图像信息也是最大的,依次递减,第零位平面能保存的图像信息最小,其保存的信息只对应于原图像的像素值为奇数或者偶数,而奇数或者偶数只是原像素值加一或者减一这一微不足道的区别罢了。

记住这个结论,因为马上我们就要用到。

像素高低差

当然了,这是从权值的角度理解,其实还有另一种理解方式:

在第七位平面,原像素值中,所有灰度值最高位是0的还是0,最高位是1的还是1,即,所有大于等于128的像素值在第七位平面的值为1,而所有小于128的像素值在第七位平面的值为0。因此图像大范围的像素值高低差还保存着,图像的信息就不会被破坏太多,所以图像轮廓也能得到保持。

而在第一位平面中,比如像素值为233,为奇数,在第一位平面的值为1,而240,为偶数,在第一位平面的值为0,因此明明240比233高,结果在第一位平面中却颠倒过来了,大大破坏了图像信息。

图像隐藏的两种算法

末位置0法

原理

设原图为图A,要隐藏的图为图B。图A的尺寸一定要大于等于图B的尺寸。

刚才也提到了,第零位平面能保存的图像信息最小。如果把图A的第零位平面清空,然后把图B转为二值图像,全部放到图A的第零位平面,那么对现在的图A来说,只是原像素值减一或者加一,人的肉眼是完全看不出变化的。

算法

①、先把图A的灰度值全部初始化为偶数(这样就清空第零位平面了)

②、把图B改为二值图像(其实就是提取图B的第七位平面,将所有大于等于128的像素值置为1,所有小于128的像素值置为0即可)

③、挨个遍历图A的像素值,每个像素值再把图B的像素值加上。

这样就实现在图A中隐藏图B了,然后从图A中取出图B也很简单,直接取图A的第零位图即可。

代码

合并图像:

% main_merge1.m
% 读取原图
Img = imread('原图.png');
[M, N, Z] = size(Img);
Img = double(Img);
ImgR2 = Img(:,:,1);
ImgG2 = Img(:,:,2);
ImgB2 = Img(:,:,3);

% 读取待隐藏的图
Imgmark = imread('待隐藏的图.png');
% 转为灰度图
Imgmark = rgb2gray(Imgmark);
% 转为二值图
Imgmark = im2bw(Imgmark);
figure;imshow(Imgmark,[]);title('待隐藏的图')

for i = 1 : M
    for j = 1 : N
	    % 清空图A第零位平面
        if mod(ImgR2(i,j), 2) == 1
            ImgR2(i,j) = ImgR2(i,j) - 1;
        end
        if mod(ImgG2(i,j), 2) == 1
            ImgG2(i,j) = ImgG2(i,j) - 1;
        end
        if mod(ImgB2(i,j), 2) == 1
            ImgB2(i,j) = ImgB2(i,j) - 1;
        end
        % 加上图B的像素值
        ImgR2(i,j) = ImgR2(i,j) + Imgmark(i, j);
        ImgG2(i,j) = ImgG2(i,j) + Imgmark(i, j);
        ImgB2(i,j) = ImgB2(i,j) + Imgmark(i, j);
    end
end

% 三通道合并
ImgNew = zeros(M, N, Z);
ImgNew(:,:,1) = ImgR2;
ImgNew(:,:,2) = ImgG2;
ImgNew(:,:,3) = ImgB2;

figure;imshow(uint8(ImgNew),[]);title('合并后的RGB图');
imwrite(uint8(ImgNew), '合并后的RGB图.png'); % 保存图片

提取被隐藏的图像:

% main_extract1.m
% 读取合并后的RGB图
Img = imread('合并后的RGB图.png');
[M, N, Z] = size(Img);
Img = double(Img);
ImgR2 = Img(:,:,1);
ImgG2 = Img(:,:,2);
ImgB2 = Img(:,:,3);

Imgmarkextract = zeros(M, N, Z);
ImgmarkextractR = Imgmarkextract(:,:,1);
ImgmarkextractG = Imgmarkextract(:,:,2);
ImgmarkextractB = Imgmarkextract(:,:,3);
for i = 1 : M
    for j = 1 : N
	    % 读取第零位平面
        if mod(ImgR2(i,j), 2) == 1
            ImgmarkextractR(i,j) = 1;
        end
        if mod(ImgG2(i,j), 2) == 1
            ImgmarkextractG(i,j) = 1;
        end
        if mod(ImgB2(i,j), 2) == 1
            ImgmarkextractB(i,j) = 1;
        end
    end
end
Imgmarkextract(:,:,1) = ImgmarkextractR;
Imgmarkextract(:,:,2) = ImgmarkextractG;
Imgmarkextract(:,:,3) = ImgmarkextractB;
figure;imshow(Imgmarkextract,[]);title('提取出的隐藏图');
imwrite(Imgmarkextract, '提取出的隐藏图.png'); % 保存图片

示例

原图:
这里写图片描述

待隐藏的图:
这里写图片描述

合并后的图:
这里写图片描述

提取出的图:
这里写图片描述

可以用StegSolve 软件打开合并后的图像验证(第零位平面整个平面图为隐藏的图像)。

在这里插入图片描述

这是合并后图像的第七位平面图,可以看到还是保存了原图中足够多的信息的。

在这里插入图片描述

这是合并后图像的第零位平面图,可以看到整个位平面图都被替换成了隐藏图像的第七位平面图,因此这种算法的缺点就是隐藏的图像容易被识破。

末位置0的缺陷就是只能隐藏二值图像,下面还有一种可以隐藏灰度图像,也是基于位运算的。

大容量隐藏法

原理

我们刚才提到的末位置0法之所以动第零位平面的刀是因为第零位平面影响原图像很小,肉眼难以察觉,那么现在我们把其他位图也利用进来隐藏图像信息。

只需要的找到一个临界条件,在这个条件下,可以尽最大可能从第零位平面往上多用几个位图来保存要隐藏的图像而又不破坏原图的信息,被人眼看出差别。

注意这本身就是个矛盾的过程,越往上位图对原图的像素影响越大,而要用更多位图隐藏图像势必会破坏原图信息,因此能动用来隐藏的位图一定要与像素值的最高非零位有“一段距离”。

现在“这段距离”我们已经找到了。
我们规定,对于红色通道图,能动用的位平面要与最高非零位有4位的距离;
对于绿色通道图,能动用的位平面要与最高非零位有5位的距离;
对于蓝色通道图,能动用的位平面要与最高非零位有3位的距离;

举个栗子:
比如现在有个像素值是233,也就是11101001,其最高非零位为第八位。
对于红色通道图要有四位的距离,八减四得四,那么我们认为可以在其红色通道图中使用第四位第三位第二位和第一位,也就是可以使用第三、第二、第一、第零位平面来保存图像且不会被肉眼看出明显差别。
以此类推,对于绿色通道图,距离为5,只可以用第零、第一、第二位平面;
对于蓝色通道图,距离为3,可以用第四、第三、第二、第一、第零位平面。

这样就能完美利用到所有像素值的位平面。

由于是按位隐藏的,所以要把待隐藏的图像的全部像素值的所有位数全部分散出,一位一位地保存到原图中去。

而在提取隐藏图像的时候,如果这个像素值最高非零位是第八位,我们就提取其红色通道图的后四位二进制数,绿色通道图的后三位,蓝色通道图的后五位。

每提取8位就合成一个灰度值,这个提取过程要持续到把隐藏的图像的所有像素灰度值全部提取回为止。最后再重新排列成隐藏的图像。

代码

合并图像:

% main_merge2.m
% 各通道肉眼可接受位差
yr = 4;
yg = 5;
yb = 3;

% 读取原图
Img = imread('原图.png');
figure;imshow(Img,[]);title('原图');

% 读取待隐藏的图
Imgmark = imread('待隐藏的图.png');
figure;imshow(Imgmark,[]);title('待隐藏的图');
% 转为灰度图
Imgmark = rgb2gray(Imgmark);
Imgmark = double(Imgmark);
[markm, markn] = size(Imgmark);
% 将灰度图的二维数组转成一列
Imgmarkline = Imgmark(:);

% 这一列再转化为更长的一列,二进制八位表示
Imgmarklinebin = zeros(markm*markn*8,1);
for ii = 1 : markm*markn
    [Imgmarklinebin(8*ii-7), Imgmarklinebin(8*ii-6), Imgmarklinebin(8*ii-5), Imgmarklinebin(8*ii-4), Imgmarklinebin(8*ii-3),...
        Imgmarklinebin(8*ii-2), Imgmarklinebin(8*ii-1), Imgmarklinebin(8*ii)] = Find8bits(Imgmarkline(ii));   
end

%%
% 获得RGB各通道分量图
Img = double(Img);
ImgR = Img(:,:,1);
ImgG = Img(:,:,2);
ImgB = Img(:,:,3);
% 嵌入
% 对于红色通道
embedNumsed = 0; % 已嵌入个数
[M, N, Z] = size(Img);
y = zeros(8, 1);
flag = 0; % 辅助跳出的标志

ImgRline = ImgR(:); % 转换为一列
ImgRlineNew = ImgRline; % 嵌入后
for ii = 1 : M*N
    if flag == 1; % 跳出外层循环
       break;
    end
    
    [y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)] = Find8bits(ImgRline(ii));   
    posNzreo = FindNotZero(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));
    embedNums = posNzreo - yr; % 能嵌入的个数
    if  embedNums > 0 %符合嵌入条件
        for jj = 1 : embedNums
            embedNumsed = embedNumsed + 1; % 已嵌入个数
            if embedNumsed > markm*markn*8 % 嵌入完成
               flag = 1; % 设置标识,使外层循环也跳出
               break;
            end
            
            y(jj) = Imgmarklinebin(embedNumsed);% 嵌入
        end
    end
    ImgRlineNew(ii) = bin2dec_trans(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));% 嵌入后的  
end
ImgR2 = reshape(ImgRlineNew, [M, N]);


% 对于G通道
ImgGline = ImgG(:); % 转换为一列
ImgGlineNew = ImgGline; % 嵌入后
for ii = 1 : M*N
    if flag == 1; % 跳出外层循环
       break;
    end
    
    [y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)] = Find8bits(ImgGline(ii));   
    posNzreo = FindNotZero(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));
    embedNums = posNzreo-yg; % 能嵌入的个数
    if  embedNums > 0 % 符合嵌入条件
        for jj = 1 : embedNums
            embedNumsed = embedNumsed + 1; % 已嵌入个数
            if embedNumsed > markm*markn*8 % 嵌入完成
               flag = 1; % 设置标识,使外层循环也跳出
               break;
            end
            
            y(jj) = Imgmarklinebin(embedNumsed); % 嵌入 
        end
    end
    ImgGlineNew(ii) = bin2dec_trans(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)); % 嵌入后的  
end
ImgG2 = reshape(ImgGlineNew, [M, N]);

% 对于B通道
ImgBline = ImgB(:); % 转换为一列
ImgBlineNew = ImgBline; % 嵌入后
for ii = 1 : M*N
    if flag == 1; % 跳出外层循环
       break;
    end
    
    [y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)] = Find8bits(ImgBline(ii));   
    posNzreo = FindNotZero(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));
    embedNums = posNzreo - yb; % 能嵌入的个数
    if  embedNums > 0 % 符合嵌入条件
        for jj = 1 : embedNums
            embedNumsed = embedNumsed + 1; % 已嵌入个数
            if embedNumsed > markm*markn*8 % 嵌入完成
               flag = 1; % 设置标识,使外层循环也跳出
               break;
            end
            
            y(jj) = Imgmarklinebin(embedNumsed); % 嵌入 
        end
    end
    ImgBlineNew(ii) = bin2dec_trans(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)); % 嵌入后的  
end
ImgB2 = reshape(ImgBlineNew, [M, N]);

ImgNew = zeros(M, N, Z);
ImgNew(:,:,1) = ImgR2;
ImgNew(:,:,2) = ImgG2;
ImgNew(:,:,3) = ImgB2;

figure;imshow(uint8(ImgNew),[]);title('合并后的RGB图');
imwrite(uint8(ImgNew), '合并后的RGB图.png'); % 保存图片

提取被隐藏的图像:

% main_extract2.m
% 各通道肉眼可接受位差
yr = 4;
yg = 5;
yb = 3;

% 读取合并后的RGB图
Img = imread('合并后的RGB图.png');
[M, N, Z] = size(Img);
Img = double(Img);
ImgR2 = Img(:,:,1);
ImgG2 = Img(:,:,2);
ImgB2 = Img(:,:,3);

% 提取嵌入图像
flag = 0;
Imgmark_extractlinebin = zeros(M*N*8, 1);
extractNumsed = 0; % 已提取个数

% R通道
ImgRline2 = ImgR2(:); % 转换为一列
for ii = 1 : M*N
    if flag == 1; % 跳出外层循环
       break;
    end
    
    [y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)] = Find8bits(ImgRline2(ii));   
    posNzreo = FindNotZero(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));
    embedNums = posNzreo - yr; % 已嵌入的个数
    if  embedNums > 0 % 符合嵌入条件
        for jj = 1 : embedNums
            
            extractNumsed = extractNumsed + 1; % 已提取个数
            if extractNumsed > M*N*8 % 提取完成
               flag = 1; % 设置标识,使外层循环也跳出
               break;
            end 
            
           Imgmark_extractlinebin(extractNumsed) = y(jj); % 提取
        end  
    end  
end

% G通道
ImgGline2 = ImgG2(:); % 转换为一列
for ii = 1 : M*N
    if flag == 1; % 跳出外层循环
       break;
    end
    
    [y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)] = Find8bits(ImgGline2(ii));   
    posNzreo = FindNotZero(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));
    embedNums = posNzreo - yg; % 已嵌入的个数
    if embedNums > 0 % 符合嵌入条件
        for jj = 1:embedNums
            
            extractNumsed = extractNumsed + 1; % 已提取个数
            if extractNumsed > M*N*8 % 提取完成
               flag = 1; % 设置标识,使外层循环也跳出
               break;
            end
            
           Imgmark_extractlinebin(extractNumsed) = y(jj);% 提取
        end
    end
end

%  G通道
ImgBline2 = ImgB2(:); % 转换为一列
for ii = 1:M*N
    if flag == 1; % 跳出外层循环
       break;
    end
    
    [y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1)] = Find8bits(ImgBline2(ii));   
    posNzreo = FindNotZero(y(8), y(7), y(6), y(5), y(4), y(3), y(2), y(1));
    embedNums = posNzreo - yb; % 已嵌入的个数
    if embedNums > 0 % 符合嵌入条件
        for jj = 1 : embedNums
            
            extractNumsed = extractNumsed + 1; % 已提取个数
            if extractNumsed > M*N*8 % 提取完成
               flag = 1; % 设置标识,使外层循环也跳出
               break;
            end
            
           Imgmark_extractlinebin(extractNumsed) = y(jj); % 提取
        end
    end
end

% 二进制转十进制
Imgmarklinedec = zeros(M*N, 1); % 转化为十进制
for ii = 1 : M*N
    Imgmarklinedec(ii) = bin2dec_trans(Imgmark_extractlinebin(8*ii-7), Imgmark_extractlinebin(8*ii-6), Imgmark_extractlinebin(8*ii-5), Imgmark_extractlinebin(8*ii-4),...
                                     Imgmark_extractlinebin(8*ii-3), Imgmark_extractlinebin(8*ii-2), Imgmark_extractlinebin(8*ii-1), Imgmark_extractlinebin(8*ii));
end
Imgmarkextract = reshape(Imgmarklinedec, [M, N]);
figure;imshow(Imgmarkextract,[]);title('提取出的隐藏图');
imwrite(uint8(Imgmarkextract), '提取出的隐藏图.png'); % 保存图片

三个工具函数:

% bin2dec_trans.m
% 二进制转十进制
function Data=bin2dec_trans(y7,y6,y5,y4,y3,y2,y1,y0)
   Data=y7*128+y6*64+y5*32+y4*16+y3*8+y2*4+y1*2+y0;
end

% Find8bits.m
function [y7,y6,y5,y4,y3,y2,y1,y0]=Find8bits(Data)
y0=mod(Data,2);
y7=fix(Data/128);Data=Data-y7*128;
y6=fix(Data/64); Data=Data-y6*64;
y5=fix(Data/32); Data=Data-y5*32;
y4=fix(Data/16); Data=Data-y4*16;
y3=fix(Data/8);  Data=Data-y3*8;
y2=fix(Data/4);  Data=Data-y2*4;
y1=fix(Data/2);  Data=Data-y1*2;
end

% FindNotZero.m
%找出第一个不为零的数位 从最高位(第八位)开始
function posNzreo=FindNotZero(y7,y6,y5,y4,y3,y2,y1,y0)
if y7~=0      posNzreo=8;
elseif y6~=0  posNzreo=7;
elseif y5~=0  posNzreo=6;
elseif y4~=0  posNzreo=5;
elseif y3~=0  posNzreo=4;
elseif y2~=0  posNzreo=3;
elseif y1~=0  posNzreo=2;
else          posNzreo=1;
end
end

示例

原图:
这里写图片描述

待隐藏的图:
这里写图片描述

合并后的图:
这里写图片描述

提取出的图:
这里写图片描述

可以看到合并后图跟原图相比有细微差距,树懒的鼻子到额头部分有点发紫,因为跟末位置0法相比,我们破坏了更多的图像信息。

而值得欣慰的就是提取出的图是完整的灰度图像,而不再是存储信息量很少的二值图像。

至于能不能隐藏彩色图像然后提取出彩色图像,我认为是可以的,只要你的原图尺寸足够大,有更多的位平面空间可以保存待隐藏图像的三个通道图即可。(三个通道图相当于三个灰度图)

可以用StegSolve 软件打开合并后的图像,可以看到不管哪个位平面都不会完整显示出待隐藏的图像,从保密性来说,肯定是完爆末位置0法的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数字图像隐藏图像的两种算法及实现代码 的相关文章

  • 数字图像处理——滤波器

    本文内容参考 数字图像处理基础 Wilhelm Burger等著 点运算 是在不改变图像大小 几何形状以及局部结构的情况下 xff0c 对像素值进行修改 xff0c 新图像的像素值只与原图像同一位置的像素值有关 滤波器 一般会用到原图像中的
  • 数字图像matlab心得,Matlab数字图像处理的学习建议

    如果是软实力 学好数学才是王道 和机器学习和计算机视觉相关的数学 转载 以下转自一位MIT牛人的空间文章 xff0c 写得很实际 xff1a 作者 xff1a Dahua 感觉数学似乎总是不够的 这些日子为了解决research中的一些问题
  • Matlab:尝试将 SCRIPT XXX 作为函数执行的解决方案

    Matlab 尝试将 SCRIPT XXX 作为函数执行的解决方案 最近在做图像处理小实验的过程中遇到了无比沙雕的情况 被自己佛了 最近真的智商不在线 或者没在线过 先描述一下问题 在Matlab中调用直方图均衡化函数histeq 但是出现
  • Matlab实现图像的比例缩放

    以灰度图像circuit tif为例 利用Matlab图像处理工具箱中的imresize函数对图像进行比例缩放变换 要求 创建4个figure窗口 不可以用subplot 显示不出来放大效果 分别用于显示原始图像 等比例放大1 5倍后的图像
  • 图像去雾算法学习

    现有的图像采集设备对外界环境的干扰非常敏感 在雾霾环境中 获取的户外图像往往退化严重 主要表现为场景特征信息模糊 对比度低 色彩失真 不利于计算机视觉系统对图像真实特征的提取 从而影响其后续的分析 理解 识别等一系列处理 很大程度上降低了视
  • 【OpenCV】噪声的添加和过滤

    1 简介 下面简单介绍两种图像噪声 即椒盐噪声和高斯噪声 1 椒盐噪声 椒盐噪声也称脉冲噪声 它是一种随机出现的白点或者黑点 可能是亮的区域有黑色像素或是在暗的区域有白色像素 或是两者皆有 图像模拟添加椒盐噪声是通过 随机获取像素点 并设置
  • 图像融合算法(像素级)

    图像融合技术可以提取自然光图像和红外图像的互补信息 获得对同一场景描述解释更为准确 全面和可靠的图像 像素级融合是常用于灰度图像与可见光图像的融合 基于源图像的彩色化就是源图像和目标图像的融合过程 使其同时兼有源图像的颜色和目标图像的形状
  • 【图像处理】彩色直方图均衡

    sourcePic imread D Images pic loc 1870358810205041517 jpg m n o size sourcePic grayPic rgb2gray sourcePic figure imshow
  • 对数及对比度拉伸变换

    对数及对比度拉伸变换 对数和对比度拉伸变换是 动态范围操作的基本工具 表达式 g c log 1 f 其中c是一个常数 f是浮点数 对数变换 应用 压缩动态范围 实现了图像灰度扩展和压缩功能 扩展低灰度值而压缩高灰度值 让图像的灰度分布更加
  • 【图像处理】彩色图直方图统计

    首先要知道彩色图是没有直方图的 只能在rgb方向分别求直方图在合并一下 干脆不用这么麻烦 用rgb2gray转到灰度图 再在二维上进行直方图绘制 最后还提供了代码 找出直方图中横坐标 像素值 为50以下的纵坐标 以此为像素的个数 的和 cl
  • 数字图像处理:局部直方图处理(Local Histogram Processing)

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 在前面章节 数字图像处理 直方图均衡学习总结 感悟 数字图像直方图匹配或规定化Histogram Matching Specific
  • 二、图像二值化方法(python)---阈值全局固定、大津法

    文章目录 阈值全局固定 利用python实现阈值全局固定时的二值化 效果图 大津法OTSU 利用Python实现大津法 效果图如下 图像二值化也叫做图像阈值化处理 通过设定某个阈值为门限 把多灰度级的图像转化为仅仅有两个极端的灰度级 0和2
  • 图象恢复——(逆滤波,维纳滤波)

    目的 对获取图像在频域用高斯函数进行退化并叠加白噪声 对退化图像进行逆滤波和维纳滤波恢复 比较原始图像和恢复图像 对利用逆滤波和维纳滤波恢复方法恢复图像进行比较 一 基本原理 图像复原是一种客观的操作 通过使用退化现象的先验知识重建或恢复一
  • 一种简单快速有效的低照度图像增强方法

    一种简单快速有效的低照度图像增强方法 一 本文介绍的是一种比较实用并且去阴影效果很好的方法 选自2004年Tao的一篇论文 名称是 An Integrated Neighborhood Dependent Approach for Nonl
  • Python下的图像处理库,你要选哪个?

    欢迎大家关注微信公众号 baihuaML 白话机器学习 码字不易 如转载请私信我 在这里 我们一起分享AI的故事 您可以在后台留言 关于机器学习 深度学习的问题 我们会选择其中的优质问题进行回答 在进行数字图像处理时 我们经常需要对图像进行
  • 《数字图像处理》学习总结及感悟:第二章数字图像基础(2)电磁波、传感器及辐射成像原理

    前往老猿Python博文目录 https blog csdn net LaoYuanPython 一 引言 本系列文章记录老猿自学冈萨雷斯 数字图像处理 的感悟和总结 不过估计更新会比较慢 白天要工作 都是晚上抽空学习 学习完一章再回头总结
  • 【数字图像处理】七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行讲解 主要通过MFC单文档视图实现显示BMP图像增强处理 包括图像普通平滑 高斯平滑 不同算子的图像锐化知识 希望该篇文章对你有所帮助
  • 计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例

    MSE Mean Squared Error 均方误差 MSE公式 MSE 计算模型的预测 与真实标签 Y 的接近程度 公式表示为 对于两个m n的单通道图像I和K 它们的均方误差可定义为 优点 MSE的函数曲线光滑 连续 处处可导 便于使
  • 冈萨雷斯《数字图像处理》学习笔记(3)--频率域滤波(含傅里叶变换推导)

    频率域滤波所有的滤波都是通过傅里叶变换在频率域实现的 所以我们先重点提出傅里叶变换 一 傅里叶变换基础 一维傅里叶变换数学推导 首先 我们知道傅里叶级数 形如 f x a0 n 1 ancos n x bnsin n x 1 f x a 0
  • 【图像处理】数码相机工作原理完整解析

    在过去二十年里 消费电子产品的大多数重要技术突破实际上可归结于一项更大意义上的科技革命 仔细观察就会发现 CD DVD 高清电视 MP3和DVR其实都是基于相同的原理 即 将传统的模拟信息转变为数字信息 这一技术上的根本转变完全颠覆了我们处

随机推荐

  • python——获取当前文件路径

    1 os getcwd os getcwd 不需要参数 os getcwd 获取的是当前工作的路径 也就是脚本运行的地方 而不是脚本本身所存在的地方 代码 print os getcwd 测试结果 2 os path abspath os
  • npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! webpack_test@1.0.0 dev: `webpack` npm ERR! Exit s

    webpack打包时 报如图错误 问题产生的原因 webpack版本过高 导致npm i 时安装的依赖不再出现在node modules中 从而命令执行报错 解决方案1 运行npm i dev 安装一下开发环境下的依赖即可 随后再执行需要运
  • 云计算虚拟机技术-KVM安装

    云计算虚拟机技术 KVM安装 作者 尹正杰 版权声明 原创作品 谢绝转载 否则将追究法律责任 身为运维的小伙伴估计大家都清楚KVM 因为在CentOS里面KVM还算很折腾的一个软件 早期CentOS使用的xen虚拟化 后因收购KVM 于是就
  • 程序员工具网站(比较有意思)

    http www cxy521 com index html
  • html中中文显示乱码,网页中文显示乱码问题

    大家好 本人目前在学习ASP NET MVC5 出现了网页显示中文乱码的问题 诡异的是Home Index页面下的中文是可以正常显示的 其他页面的中文就不能正常显示了 不能正常显示中文的页面中 通过后台代码显示的字符串是正常的 直接卸载HT
  • Oracle数据库 Explain工具(语句执行索引使用情况)

    1 Explain工具的作用 Explain工具可以查看SQL语句的执行过程SQL索引的使用情况 2 Oracle数据库查看语句执行的情况语句 explain plan for select id from abc where a 1 an
  • 不确定性世界中的行为预测

    桔妹导读 自动驾驶系统中的行为预测模块主要负责预判其他交通参与者未来一段时间的行为 其困难主要源自现实世界和人类行为的高度不确定性 本文列举了现实环境中的不同场景 讨论了两种不同预测方法 即基于行为规划的预测和基于机器学习的预测 用于准确预
  • 多元统计分析实验-线性回归

    1 实验目的 通过本实验使学生熟练运用python语言编写线性回归分析程序 2 实验内容 有以下两组数据 第一组数据为我国2004年31个地区城镇居民年人均可支配收入和年人均消费性支出数据 第二组数据为随机抽查的36个人的当前年薪y 美元
  • 基于直方图均衡化的水下激光图像处理(MATLAB仿真)

    原文 http blog csdn net sunlinyi66 article details 39215447 基于直方图均衡化的水下图像增强 MATLAB仿真 可以对RGB三个通道进行直方图规定化从而实现水下图像增强 此处我们使用的是
  • python爬虫学习34

    python爬虫学习34 目录 python爬虫学习34 九 parsel 库的使用其一 9 1 parsel 库的下载 9 2 初始化 9 3 提取文本 今天呢就进入到爬虫网页数据解析提取的最后一个小节 与大家一同学习parsel库的使用
  • 牛客网 D-坐标计数

    链接 https ac nowcoder com acm contest 10746 D 来源 牛客网 题目描述 定义一个坐标变换 坐标 x y 变换后变为 x y x y 给定一片矩形区域 计算区域内有多少个整数点在经过有限次变换后变为
  • redis持久化机制

    redis持久化机制 https www jianshu com p 9d6cebe98d5a
  • C# - var 关键字

    C var 关键字 引言 var 关键字使用规则 var 在表达式中的应用 例 1 var 可以选 例 2 var 必要 引言 C 代码经常会看到 var 关键字定义一个变量 带点神秘色彩 今天就来揭秘一下 从 C 3 0 开始 在方法范围
  • 【2022年1月1日更新】宝塔+青龙+Nvjdc&一对一推送+wskey智能化+管理员推送+Ninja+SaoBing面板+kingfeng+go-cqhttp/qqbot

    前言 2023年这些技术一部分不能用了 现在最优的技术是 青龙 ark短信登录 傻妞机器人 cqhttp或one node 具体可以参考我专栏里的其他文章 专栏 青龙相关 首先声明我也不是什么大佬 只是坑踩多了有经验了而已 看了无数大佬的文
  • GitHub上排名前100的优秀开源项目

    主要对当前 GitHub 排名前 100 的项目做一个简单的简介 方便初学者快速了解到当前 Objective C 在 GitHub 的情况 若有任何疑问可通过微博 甲骨文儿联系我 项目名称 项目信息 1 AFNetworking 作者是
  • 文件系统(4)——Ubuntu system service设置自动登录

    参考链接 linux systemd启动方式解析 如何开机自动登录 开机自动运行程序 https blog csdn net a617996505 article details 88423794 涉及文件 OK3399 linux ubu
  • STM32学习笔记----(4)GPIO

    STM32必须掌握的有时钟树和系统架构 感觉那个是比较简单的 多看几遍就能看会了 在后面的笔记中也会记录到这些 如果自己看不懂的话可以跟着不同外设的笔记来了解一下 这篇笔记是讲解的GPIO 学会了GPIO的话就可以完成32的第一个功能 ST
  • Android应用的闪退(crash)分析

    文章转自阿里客户端工程师试题简析 Android应用的闪退 crash 分析 1 问题描述 闪退 Crash 是客户端程序在运行时遭遇无法处理的异常或错误时而退出应用程序的表现 请从crash发生的原因分类与解决方法 在出现crash后如何
  • 人类高质量网格重建算法

    通常对于几何曲面的绘制采用采样描点的方式 比如球的方程为 对于这个方程可以将其改为参数方程 然后对与进行离散化 从而得到一系列的离散点 下面是c 的代码生成一个球 class Sphere public Mesh public Sphere
  • 数字图像隐藏图像的两种算法及实现代码

    数字图像 二值图像 也叫单色图像 是将每个像素点存放在一个bit空间 值为0或者1 的图像 也就是说每个像素 非黑即白 主要用于图像形态学的研究 8位灰度图像 每个像素存放在一个byte空间 8位 0 255 0表示最暗色黑色 255表示最