-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDDBTC_Encode.m
52 lines (40 loc) · 2.05 KB
/
DDBTC_Encode.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
function [xMin, xMax, imageBitmap] = DDBTC_Encode(inputImage, blockSizeX, blockSizeY, classMatrix, diffusedMatrix);
inputImage = double(inputImage);
[row, col] = size(inputImage);
numberOfBlockX = row / blockSizeX;
numberOfBlockY = col / blockSizeY;
inputImage = mat2cell(inputImage, blockSizeX*ones(1, numberOfBlockX), blockSizeY*ones(1, numberOfBlockY));
imageBitmap = zeros(row, col);
imageBitmap = mat2cell(imageBitmap, blockSizeX*ones(1, numberOfBlockX), blockSizeY*ones(1, numberOfBlockY));
xMin = zeros(numberOfBlockX, numberOfBlockY);
xMax = zeros(numberOfBlockX, numberOfBlockY);
for i=1: numberOfBlockX
for j=1: numberOfBlockY
pixel = inputImage{i, j};
[xMin(i, j), xMax(i, j), imageBitmap{i, j}] = PerformErrorDiffusionHalftoning(pixel, classMatrix, diffusedMatrix);
end;
end;
imageBitmap = cell2mat(imageBitmap);
function [xMin, xMax, imageBitmap] = PerformErrorDiffusionHalftoning(pixel, classMatrix, diffusedMatrix);
[row, col] = size(pixel);
[classMatrixSizeX, classMatrixSizeY] = size(classMatrix);
xMin = min(pixel(:));
xMax = max(pixel(:));
xMean = mean(pixel(:));
r = 1;
x = padarray(pixel, [r r], 'symmetric');
paddedClassMatrix = padarray(classMatrix, [r r], 'symmetric');
imageBitmap = zeros(row, col);
for processingOrder = 0: classMatrixSizeX*classMatrixSizeY-1
[positionOrderX, positionOrderY] = find(classMatrix == processingOrder);
if x(positionOrderX+r, positionOrderY+r) < xMean
imageBitmap(positionOrderX, positionOrderY) = 0;
o = xMin;
else
imageBitmap(positionOrderX, positionOrderY) = 1;
o = xMax;
end;
e = x(positionOrderX+r, positionOrderY+r) - o;
unProcessedPixel = (paddedClassMatrix(positionOrderX+r-r: positionOrderX+r+r, positionOrderY+r-r: positionOrderY+r+r) >= processingOrder);
x(positionOrderX+r-r: positionOrderX+r+r, positionOrderY+r-r: positionOrderY+r+r) = x(positionOrderX+r-r: positionOrderX+r+r, positionOrderY+r-r: positionOrderY+r+r) + e*(unProcessedPixel.*diffusedMatrix)/sum(sum(unProcessedPixel.*diffusedMatrix));
end;