我真的会谢,为什么我跑出来是一片黑呀?本matlab小白跪求matlab大佬答疑解惑555555感谢
以下是我的程序:
% 读取原始图像和水印图像
I = imread('lena.bmp');
W = imread('waterMark.bmp');% 将图像转为灰度图,并将水印调整为与原始图像大小一致
I = im2gray(I);
W = im2gray(W);
W = imresize(W, size(I));% 将灰度图像归一化到0~1之间
I = double(I) / 255;% 将水印图像二值化为0或1,并将其归一化到0~1之间
W = imbinarize(W);
W = double(W);% DCT变换处理
BLOCKSIZE = 8;
dctmtx8 = dctmtx(BLOCKSIZE);
Q = round(dctmtx8 * (dctmtx8'));
siz = size(I);
nblocksX = siz(1) / BLOCKSIZE;
nblocksY = siz(2) / BLOCKSIZE;
for i = 1:nblocksXfor j = 1:nblocksY% 提取8x8块block = I((i-1)*BLOCKSIZE+1:i*BLOCKSIZE, (j-1)*BLOCKSIZE+1:j*BLOCKSIZE);% DCT变换freq = Q * block * Q';% 计算子区域的HVS权值HVSWeight = hvs(freq);% 调整水印嵌入强度自适应alpha = 0.5 * (max(max(freq)) - min(min(freq))) * (1 - mean2(W((i-1)*BLOCKSIZE+1:i*BLOCKSIZE, (j-1)*BLOCKSIZE+1:j*BLOCKSIZE)));alpha = alpha ./ HVSWeight;% 嵌入水印freq = freq + alpha * (W((i-1)*BLOCKSIZE+1:i*BLOCKSIZE, (j-1)*BLOCKSIZE+1:j*BLOCKSIZE) - 0.5);% IDCT反变换block = Q' * freq * Q;% 更新原始图像对应块I((i-1)*BLOCKSIZE+1:i*BLOCKSIZE, (j-1)*BLOCKSIZE+1:j*BLOCKSIZE) = block;end
end% 显示处理后的图像并保存
imshow(I)
imwrite(I, 'watermarked_image.jpg');function Weight = hvs(freq)
% 计算子区域的HVS权值
[H,W] = size(freq);
if mod(H,2) == 0rows = [0: (H/2 - 1) , -(H/2): -1];
elserows = [0 : (H-1)/2, -(H-1)/2: -1];
end
if mod(W,2) == 0cols = [0: (W/2 - 1) , -(W/2): -1];
elsecols = [0 : (W-1)/2, -(W-1)/2: -1];
end
[X,Y] = meshgrid(cols,rows);
f = sqrt(X.^2 + Y.^2);
M = f ./ (0.008*f + 0.45);
S = 2.6 * (0.0192*f + 1) .^ (-0.114) - 0.08;
Weight = M .* S;
end
lena.bmp大小是512x512
waterMark.bmp大小是64x64但后来缩放到和载体图像一样大了
感觉放不放我的载体图像和水印图像都问题一样,csdn还自动给图片加了水印