Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.64 KB | None | 0 0
  1. %% isValid.m
  2.  
  3. function result = isValid (H, W, border, Y)
  4. result = 0;
  5. quants = size(border);
  6. shots = zeros (size(border, 1)-1, 1);
  7. for i = 1:H
  8. for j = 1:W
  9. for k = 1:quants
  10. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  11. shots(k) = 1;
  12. end
  13. end
  14. end
  15. end
  16. if min(shots) == 1
  17. result = 1;
  18. end
  19. end
  20.  
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31. %% newBorder.m
  32.  
  33. function border = newBorder(H, W, border, Y)
  34. quants = size(border, 1) - 1;
  35. shots = zeros (size(border, 1)-1, 1);
  36. plain = zeros (H*W, 1);
  37. for i = 1:H
  38. for j = 1:W
  39. for k = 1:quants
  40. plain(i*W + j) = Y(i, j);
  41. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  42. shots(k) = 1;
  43. end
  44. end
  45. end
  46. end
  47. [flag, pos] = min(shots);
  48. m = mean(plain);
  49. M = fix(quants/2); %интенсивность сдвига
  50. while flag == 0
  51. if m > border(pos)
  52. M = quants - pos - 2;
  53. for i = 1:M
  54. border(pos+i) = border(pos+i)+(M-i)/M;
  55. end
  56. else
  57. M = pos-1;
  58. for i = 1:M
  59. border(pos+1-i) = border(pos+1-i)-(M-i)/M*(border(pos+1-i)-border(pos-i));
  60. end
  61. end
  62. shots = zeros (size(border, 1)-1, 1);
  63. for i = 1:H
  64. for j = 1:W
  65. for k = 1:quants
  66. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  67. shots(k) = 1;
  68. end
  69. end
  70. end
  71. end
  72. for i = 1:quants
  73. if border(i) > border(i + 1)
  74. disp('ERROR!');
  75. end
  76. end
  77. [flag, pos] = min(shots);
  78. end
  79. end
  80.  
  81.  
  82.  
  83.  
  84.  
  85.  
  86.  
  87.  
  88.  
  89.  
  90.  
  91. %% Основной код, собсна
  92.  
  93. clear;
  94. close all;
  95. MAXR = 7;
  96. picture = imread('C:\Users\Tuhlomon\Desktop\Bright_2.bmp');
  97. H = size(picture, 1);
  98. W = size(picture, 2);
  99. Y = zeros(H, W);
  100. for i = 1:H
  101. for j = 1:W
  102. Y(i, j) = picture(i, j, 1)*0.299 + picture(i, j, 2)*0.587 + picture(i, j, 3)*0.114;
  103. end
  104. end
  105.  
  106. U = zeros(H, W, MAXR);
  107. for R = 1:MAXR
  108. quants = 2^R;
  109. minimum = min(min(Y));
  110. maximum = max(max(Y));
  111. border = zeros (quants+1, 1);
  112. border(1) = -0.000001;
  113. approx = zeros (quants, 1);
  114. delta = (maximum-minimum)/quants;
  115. for i = 1:quants
  116. border(i+1) = minimum + i*delta;
  117. approx(i) = (border(i)+border(i+1))/2;
  118. end
  119. border(quants+1) = 255.000001;
  120. valid = isValid(H, W, border, Y);
  121. disp (valid);
  122. if (valid == 0)
  123. border = newBorder(H, W, border, Y);
  124. valid = isValid(H, W, border, Y);
  125. disp ('new valid = ');
  126. disp (valid);
  127. end
  128. Teps = 0.0001;
  129. DELTAeps = 0.0001;
  130. epsilonPred = 0;
  131. pmax = 20;
  132. newU = zeros(H, W);
  133. for i = 1:H
  134. for j = 1:W
  135. newU = 255;
  136. end
  137. end
  138. %Алгоритм Макса-Ллойда
  139. for P = 1:pmax
  140. Q = zeros (quants, 1);
  141. average = zeros (quants, 1);
  142. for i = 1:H
  143. for j = 1:W
  144. index = quants;
  145. for k = 1:quants
  146. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  147. index = k;
  148. newU(i, j) = approx(k);
  149. break
  150. end
  151. end
  152. Q(index) = Q(index)+1;
  153. average(index) = average(index)+Y(i,j);
  154. end
  155. end
  156. average = average ./ Q;
  157. approx = average;
  158. epsilon = 0;
  159. for i = 1:H
  160. for j = 1:W
  161. epsilon = epsilon + (newU(i, j) - Y(i, j))^2;
  162. end
  163. end
  164. epsilon = epsilon / (H * W);
  165. if epsilon < Teps
  166. break
  167. end
  168. if abs(epsilon - epsilonPred) < DELTAeps
  169. break
  170. end
  171. for i = 2:quants
  172. border(i) = (approx(i-1)+approx(i))/2;
  173. end
  174. epsilonPred = epsilon;
  175. end
  176. %%% квантование
  177. for i = 1:H
  178. for j = 1:W
  179. for k = 1:quants
  180. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  181. U(i, j, R) = approx(k);
  182. break;
  183. end
  184. end
  185. end
  186. end
  187. end
  188.  
  189. figure(1);
  190. approx(quants+1) = approx(quants);
  191. stairs(border, approx);
  192.  
  193. SNR = zeros (MAXR, 1);
  194. A = Y.^2;
  195. for R = 1:MAXR
  196. B = (Y-U(:, :, R)).^2;
  197. SNR(R) = 10*log10(sum(A)/sum(B));
  198. end
  199. t = 1:1:MAXR;
  200. figure(2);
  201. plot(t, SNR), legend('SNR(R) bright');
  202. hold on;
  203.  
  204. PSNR = zeros (MAXR, 1);
  205. for R = 1:MAXR
  206. epsilon = 0;
  207. for i = 1:H
  208. for j = 1:W
  209. epsilon = epsilon + (U(i, j, R) - Y(i, j))^2;
  210. end
  211. end
  212. PSNR(R) = 10*log10(W*H*(255^2)/epsilon);
  213. end
  214. figure(3);
  215. plot(t, PSNR), legend('PSNR(R) bright');
  216. hold on;
  217.  
  218. He = zeros (MAXR, 1);
  219. for R = 1:MAXR
  220. p = zeros(2^R, 1);
  221. for i = 1:H
  222. for j = 1:W
  223. for k = 1:2^R
  224. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  225. p(k) = p(k) + 1;
  226. break;
  227. end
  228. end
  229. end
  230. end
  231. for i = 1:2^R
  232. if p(i) ~= 0
  233. p(i) = p(i)/(H*W);
  234. He(R) = He(R) + (p(i)*log2(p(i)));
  235. end
  236. end
  237. He(R) = -He(R);
  238. end
  239. figure(4);
  240. plot(He, PSNR), legend('PSNR(H) bright');
  241. hold on;
  242.  
  243. imwrite(U(:,:,1)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R1.bmp');
  244. imwrite(U(:,:,2)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R2.bmp');
  245. imwrite(U(:,:,3)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R3.bmp');
  246. imwrite(U(:,:,4)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R4.bmp');
  247. imwrite(U(:,:,5)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R5.bmp');
  248. imwrite(U(:,:,6)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R6.bmp');
  249. imwrite(U(:,:,7)./255, 'C:\Users\Tuhlomon\Desktop\учеба\цос\tests2\R7.bmp');
  250.  
  251.  
  252.  
  253.  
  254.  
  255.  
  256.  
  257.  
  258.  
  259.  
  260. picture = imread('C:\Users\Tuhlomon\Desktop\dark_2.bmp');
  261. H = size(picture, 1);
  262. W = size(picture, 2);
  263. Y = zeros(H, W);
  264. for i = 1:H
  265. for j = 1:W
  266. Y(i, j) = picture(i, j, 1)*0.299 + picture(i, j, 2)*0.587 + picture(i, j, 3)*0.114;
  267. end
  268. end
  269.  
  270. p = zeros(256, 1);
  271. for i = 1:H
  272. for j = 1:W
  273. for k = 1:256
  274. if Y(i, j) == k
  275. p(k) = 1;
  276. break;
  277. end
  278. end
  279. end
  280. end
  281. sump = sum(p);
  282. MAXR = 6;
  283.  
  284. U = zeros(H, W, MAXR);
  285. for R = 1:MAXR
  286. quants = 2^R;
  287. minimum = min(min(Y));
  288. maximum = max(max(Y));
  289. border = zeros (quants+1, 1);
  290. border(1) = -0.000001;
  291. approx = zeros (quants, 1);
  292. delta = (maximum-minimum)/quants;
  293. for i = 1:quants
  294. border(i+1) = minimum + i*delta;
  295. approx(i) = (border(i)+border(i+1))/2;
  296. end
  297. border(quants+1) = 255.000001;
  298. valid = isValid(H, W, border, Y);
  299. disp (valid);
  300. if (valid == 0)
  301. border = newBorder(H, W, border, Y);
  302. valid = isValid(H, W, border, Y);
  303. disp ('new valid = ');
  304. disp (valid);
  305. end
  306. Teps = 0.0001;
  307. DELTAeps = 0.0001;
  308. epsilonPred = 0;
  309. pmax = 20;
  310. newU = zeros(H, W);
  311. for i = 1:H
  312. for j = 1:W
  313. newU = 255;
  314. end
  315. end
  316. %Алгоритм Макса-Ллойда
  317. for P = 1:pmax
  318. Q = zeros (quants, 1);
  319. average = zeros (quants, 1);
  320. for i = 1:H
  321. for j = 1:W
  322. index = quants;
  323. for k = 1:quants
  324. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  325. index = k;
  326. newU(i, j) = approx(k);
  327. break
  328. end
  329. end
  330. Q(index) = Q(index)+1;
  331. average(index) = average(index)+Y(i,j);
  332. end
  333. end
  334. flag = 0;
  335. for i = 1:quants
  336. if average(index) == 0
  337. disp('ERROR! NO HIT IN QUANT!');
  338. flag = 1;
  339. break;
  340. end
  341. end
  342. if flag == 1
  343. break;
  344. end
  345. average = average ./ Q;
  346. approx = average;
  347. epsilon = 0;
  348. for i = 1:H
  349. for j = 1:W
  350. epsilon = epsilon + (newU(i, j) - Y(i, j))^2;
  351. end
  352. end
  353. epsilon = epsilon / (H * W);
  354. if epsilon < Teps
  355. break
  356. end
  357. if abs(epsilon - epsilonPred) < DELTAeps
  358. break
  359. end
  360. for i = 2:quants
  361. border(i) = (approx(i-1)+approx(i))/2;
  362. end
  363. epsilonPred = epsilon;
  364. end
  365. %%% квантование
  366. for i = 1:H
  367. for j = 1:W
  368. for k = 1:quants
  369. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  370. U(i, j, R) = approx(k);
  371. break;
  372. end
  373. end
  374. end
  375. end
  376. end
  377.  
  378. figure(1);
  379. approx(quants+1) = approx(quants);
  380. stairs(border, approx);
  381.  
  382. SNR = zeros (MAXR, 1);
  383. A = Y.^2;
  384. for R = 1:MAXR
  385. B = (Y-U(:, :, R)).^2;
  386. SNR(R) = 10*log10(sum(A)/sum(B));
  387. end
  388. t = 1:1:MAXR;
  389. figure(2);
  390. plot(t, SNR), legend('SNR(R) bright');
  391. hold on;
  392.  
  393. PSNR = zeros (MAXR, 1);
  394. for R = 1:MAXR
  395. epsilon = 0;
  396. for i = 1:H
  397. for j = 1:W
  398. epsilon = epsilon + (U(i, j, R) - Y(i, j))^2;
  399. end
  400. end
  401. PSNR(R) = 10*log10(W*H*(255^2)/epsilon);
  402. end
  403. figure(3);
  404. plot(t, PSNR), legend('PSNR(R) bright');
  405. hold on;
  406.  
  407. He = zeros (MAXR, 1);
  408. for R = 1:MAXR
  409. p = zeros(2^R, 1);
  410. for i = 1:H
  411. for j = 1:W
  412. for k = 1:2^R
  413. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  414. p(k) = p(k) + 1;
  415. break;
  416. end
  417. end
  418. end
  419. end
  420. for i = 1:2^R
  421. if p(i) ~= 0
  422. p(i) = p(i)/(H*W);
  423. He(R) = He(R) + (p(i)*log2(p(i)));
  424. end
  425. end
  426. He(R) = -He(R);
  427. end
  428. figure(4);
  429. plot(He, PSNR), legend('PSNR(H) bright');
  430. hold on;
  431.  
  432.  
  433.  
  434.  
  435.  
  436.  
  437.  
  438.  
  439.  
  440.  
  441.  
  442.  
  443.  
  444. picture = imread('C:\Users\Tuhlomon\Desktop\lenna.ppm');
  445. H = size(picture, 1);
  446. W = size(picture, 2);
  447. Y = zeros(H, W);
  448. for i = 1:H
  449. for j = 1:W
  450. Y(i, j) = picture(i, j, 1)*0.299 + picture(i, j, 2)*0.587 + picture(i, j, 3)*0.114;
  451. end
  452. end
  453.  
  454. MAXR = 7;
  455. U = zeros(H, W, MAXR);
  456. for R = 1:MAXR
  457. quants = 2^R;
  458. minimum = min(min(Y));
  459. maximum = max(max(Y));
  460. border = zeros (quants+1, 1);
  461. border(1) = -0.000001;
  462. approx = zeros (quants, 1);
  463. delta = (maximum-minimum)/quants;
  464. for i = 1:quants
  465. border(i+1) = minimum + i*delta;
  466. approx(i) = (border(i)+border(i+1))/2;
  467. end
  468. border(quants+1) = 255.000001;
  469. valid = isValid(H, W, border, Y);
  470. disp (valid);
  471. if (valid == 0)
  472. border = newBorder(H, W, border, Y);
  473. valid = isValid(H, W, border, Y);
  474. disp ('new valid = ');
  475. disp (valid);
  476. end
  477. Teps = 0.0001;
  478. DELTAeps = 0.0001;
  479. epsilonPred = 0;
  480. pmax = 20;
  481. newU = zeros(H, W);
  482. for i = 1:H
  483. for j = 1:W
  484. newU = 255;
  485. end
  486. end
  487. %Алгоритм Макса-Ллойда
  488. for P = 1:pmax
  489. Q = zeros (quants, 1);
  490. average = zeros (quants, 1);
  491. for i = 1:H
  492. for j = 1:W
  493. index = quants;
  494. for k = 1:quants
  495. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  496. index = k;
  497. newU(i, j) = approx(k);
  498. break
  499. end
  500. end
  501. Q(index) = Q(index)+1;
  502. average(index) = average(index)+Y(i,j);
  503. end
  504. end
  505. average = average ./ Q;
  506. approx = average;
  507. epsilon = 0;
  508. for i = 1:H
  509. for j = 1:W
  510. epsilon = epsilon + (newU(i, j) - Y(i, j))^2;
  511. end
  512. end
  513. epsilon = epsilon / (H * W);
  514. if epsilon < Teps
  515. break
  516. end
  517. if abs(epsilon - epsilonPred) < DELTAeps
  518. break
  519. end
  520. for i = 2:quants
  521. border(i) = (approx(i-1)+approx(i))/2;
  522. end
  523. epsilonPred = epsilon;
  524. end
  525. %%% квантование
  526. for i = 1:H
  527. for j = 1:W
  528. for k = 1:quants
  529. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  530. U(i, j, R) = approx(k);
  531. break;
  532. end
  533. end
  534. end
  535. end
  536. end
  537.  
  538. figure(1);
  539. approx(quants+1) = approx(quants);
  540. stairs(border, approx);
  541.  
  542. SNR = zeros (MAXR, 1);
  543. A = Y.^2;
  544. for R = 1:MAXR
  545. B = (Y-U(:, :, R)).^2;
  546. SNR(R) = 10*log10(sum(A)/sum(B));
  547. end
  548. t = 1:1:MAXR;
  549. figure(2);
  550. plot(t, SNR), legend('SNR(R) bright', 'SNR(R) dark', 'SNR(R) lenna');
  551. hold on;
  552.  
  553. PSNR = zeros (MAXR, 1);
  554. for R = 1:MAXR
  555. epsilon = 0;
  556. for i = 1:H
  557. for j = 1:W
  558. epsilon = epsilon + (U(i, j, R) - Y(i, j))^2;
  559. end
  560. end
  561. PSNR(R) = 10*log10(W*H*(255^2)/epsilon);
  562. end
  563. figure(3);
  564. plot(t, PSNR), legend('PSNR(R) bright', 'PSNR(R) dark', 'PSNR(R) lenna');
  565. hold on;
  566.  
  567. He = zeros (MAXR, 1);
  568. for R = 1:MAXR
  569. p = zeros(2^R, 1);
  570. for i = 1:H
  571. for j = 1:W
  572. for k = 1:2^R
  573. if Y(i, j) >= border(k) && Y(i, j) < border(k+1)
  574. p(k) = p(k) + 1;
  575. break;
  576. end
  577. end
  578. end
  579. end
  580. for i = 1:2^R
  581. if p(i) ~= 0
  582. p(i) = p(i)/(H*W);
  583. He(R) = He(R) + (p(i)*log2(p(i)));
  584. end
  585. end
  586. He(R) = -He(R);
  587. end
  588. figure(4);
  589. plot(He, PSNR), legend('PSNR(H) bright', 'PSNR(H) dark', 'PSNR(H) lenna');
  590. hold on;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement