Filter.cpp
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:8k
源码类别:

图形图象

开发平台:

Visual C++

  1. // 未完成文件
  2. #include "stdafx.h"
  3. #include "filter.h"
  4. #include "AdjustContrast.h"
  5. #include "System.h"
  6. #include "ConvoluteKernel.h"
  7. #define FILTER1 1
  8. #define FILTER2 2
  9. #define FILTER3 3
  10. void _fnSPE_Filter(int *red,int *green,int *blue,int i,int j,
  11.    WORD wBytesPerLine,LPBYTE lpData,DWORD *dwFact)
  12. {
  13. BYTE b[9],g[9],r[9];
  14. LONG lOffset;
  15. // DWORD dwGrayList[9],dwAddList[9];
  16. DWORD dwGrayTotal,dwDivisor,dwGray,dwTemp;
  17. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  18. // dwAddList[0]=lOffset;
  19. b[0]=*(lpData+lOffset++);
  20. g[0]=*(lpData+lOffset++);
  21. r[0]=*(lpData+lOffset);
  22. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j)*4);
  23. // dwAddList[1]=lOffset;
  24. b[1]=*(lpData+lOffset++);
  25. g[1]=*(lpData+lOffset++);
  26. r[1]=*(lpData+lOffset);
  27. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  28. // dwAddList[2]=lOffset;
  29. b[2]=*(lpData+lOffset++);
  30. g[2]=*(lpData+lOffset++);
  31. r[2]=*(lpData+lOffset);
  32. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  33. // dwAddList[3]=lOffset;
  34. b[3]=*(lpData+lOffset++);
  35. g[3]=*(lpData+lOffset++);
  36. r[3]=*(lpData+lOffset);
  37. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4);
  38. // dwAddList[4]=lOffset;
  39. b[4]=*(lpData+lOffset++);
  40. g[4]=*(lpData+lOffset++);
  41. r[4]=*(lpData+lOffset);
  42. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  43. // dwAddList[5]=lOffset;
  44. b[5]=*(lpData+lOffset++);
  45. g[5]=*(lpData+lOffset++);
  46. r[5]=*(lpData+lOffset);
  47. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  48. // dwAddList[6]=lOffset;
  49. b[6]=*(lpData+lOffset++);
  50. g[6]=*(lpData+lOffset++);
  51. r[6]=*(lpData+lOffset);
  52. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j)*4);
  53. // dwAddList[7]=lOffset;
  54. b[7]=*(lpData+lOffset++);
  55. g[7]=*(lpData+lOffset++);
  56. r[7]=*(lpData+lOffset);
  57. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  58. // dwAddList[8]=lOffset;
  59. b[8]=*(lpData+lOffset++);
  60. g[8]=*(lpData+lOffset++);
  61. r[8]=*(lpData+lOffset);
  62. dwGrayTotal=dwDivisor=0;
  63. for(int k=0;k<9;k++)
  64. {
  65. dwGrayTotal+=((r[k]*30+g[k]*59+b[k]*11)/100)*dwFact[k];
  66. dwDivisor+=dwFact[k];
  67. }
  68. dwGrayTotal /= dwDivisor;
  69. dwGray = (r[4]*30+g[4]*59+b[4]*11)/100;
  70. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4);
  71. if( dwGray != 0 ) 
  72. dwTemp = ( ( *(lpData+lOffset++) * dwGrayTotal ) / dwGray );
  73. else 
  74. dwTemp = ( dwGrayTotal + dwGray ) / 2;
  75. if( dwTemp > 255 ) 
  76. dwTemp = 255;
  77. *blue = (unsigned char) dwTemp;
  78. if( dwGray != 0 )
  79. dwTemp = ( ( *(lpData+lOffset++) * dwGrayTotal ) / dwGray );
  80. else 
  81. dwTemp = ( dwGrayTotal + dwGray ) / 2;
  82. if( dwTemp > 255 ) 
  83. dwTemp = 255;
  84. *green = (unsigned char) dwTemp;
  85. if( dwGray != 0 ) 
  86. dwTemp = ( ( *(lpData+lOffset++) * dwGrayTotal ) / dwGray );
  87. else 
  88. dwTemp = ( dwGrayTotal + dwGray ) / 2;
  89. if( dwTemp > 255 ) 
  90. dwTemp = 255;
  91. *red = (unsigned char) dwTemp;
  92. }
  93. BOOL _fnCOM_HighFilter(LPIMAGEPROCSTR lpInfo,int nStrength,int nStype)
  94. {
  95. CopyMemory(lpInfo->_pdbdata ,lpInfo->_psbdata ,lpInfo->sImageInfo.width*lpInfo->sImageInfo.height*(lpInfo->sImageInfo.bitperpix/8));
  96. WORD skip=lpInfo->sImageInfo .byteperline ;
  97. static DWORD dwFact[9];
  98. switch(nStype)
  99. {
  100. case 0:
  101. dwFact[0]=10;
  102. dwFact[1]=10;
  103. dwFact[2]=10;
  104. dwFact[3]=10;
  105. dwFact[4]=160+nStrength;
  106. dwFact[5]=10;
  107. dwFact[6]=10;
  108. dwFact[7]=10;
  109. dwFact[8]=10;
  110. break;
  111. case 1:
  112. dwFact[0]=10;
  113. dwFact[1]=10;
  114. dwFact[2]=10;
  115. dwFact[3]=10;
  116. dwFact[4]=10;
  117. dwFact[5]=10;
  118. dwFact[6]=10;
  119. dwFact[7]=10;
  120. dwFact[8]=10;
  121. break;
  122. }
  123. UINT i,j;
  124. for(i=1;i<(UINT)lpInfo->sImageInfo.height-1;i++)
  125. {
  126. for(j=1;j<(UINT)lpInfo->sImageInfo.width-1;j++)
  127. {
  128. int red=0,green=0,blue=0;
  129. _fnSPE_Filter(&red,&green,&blue,i,j,skip,lpInfo->_psbdata,dwFact);
  130. LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
  131. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
  132. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
  133. *(lpInfo->_pdbdata+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
  134. }
  135. }
  136. return PROCERR_SUCCESS;
  137. }
  138. void _fnSPE_MedianFilter(int *red,int *green,int *blue,int i,int j,
  139.  int nPels,WORD wBytesPerLine,LPBYTE lpData,
  140.  int nStype)
  141. {
  142. BYTE b[9],g[9],r[9];
  143. LONG lOffset;
  144. DWORD dwMedianList[9],dwAddList[9];
  145. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  146. dwAddList[0]=lOffset;
  147. b[0]=*(lpData+lOffset++);
  148. g[0]=*(lpData+lOffset++);
  149. r[0]=*(lpData+lOffset);
  150. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j)*4);
  151. dwAddList[1]=lOffset;
  152. b[1]=*(lpData+lOffset++);
  153. g[1]=*(lpData+lOffset++);
  154. r[1]=*(lpData+lOffset);
  155. lOffset=(LONG)(i-1)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  156. dwAddList[2]=lOffset;
  157. b[2]=*(lpData+lOffset++);
  158. g[2]=*(lpData+lOffset++);
  159. r[2]=*(lpData+lOffset);
  160. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  161. dwAddList[3]=lOffset;
  162. b[3]=*(lpData+lOffset++);
  163. g[3]=*(lpData+lOffset++);
  164. r[3]=*(lpData+lOffset);
  165. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j)*4);
  166. dwAddList[4]=lOffset;
  167. b[4]=*(lpData+lOffset++);
  168. g[4]=*(lpData+lOffset++);
  169. r[4]=*(lpData+lOffset);
  170. lOffset=(LONG)(i)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  171. dwAddList[5]=lOffset;
  172. b[5]=*(lpData+lOffset++);
  173. g[5]=*(lpData+lOffset++);
  174. r[5]=*(lpData+lOffset);
  175. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j-1)*4);
  176. dwAddList[6]=lOffset;
  177. b[6]=*(lpData+lOffset++);
  178. g[6]=*(lpData+lOffset++);
  179. r[6]=*(lpData+lOffset);
  180. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j)*4);
  181. dwAddList[7]=lOffset;
  182. b[7]=*(lpData+lOffset++);
  183. g[7]=*(lpData+lOffset++);
  184. r[7]=*(lpData+lOffset);
  185. lOffset=(LONG)(i+1)*(LONG)wBytesPerLine+(LONG)((j+1)*4);
  186. dwAddList[8]=lOffset;
  187. b[8]=*(lpData+lOffset++);
  188. g[8]=*(lpData+lOffset++);
  189. r[8]=*(lpData+lOffset);
  190. // 以下应有更好的算法,不过我还没想好。
  191. /*
  192. qsort(r,9,1,Compare);
  193. qsort(g,9,1,Compare);
  194. qsort(b,9,1,Compare);
  195. switch(nStype)
  196. {
  197. case 0:
  198. *red=r[4];
  199. *green=g[4];
  200. *blue=b[4];
  201. break;
  202. case 1:
  203. *red=r[0];
  204. *green=g[0];
  205. *blue=b[0];
  206. break;
  207. case 2:
  208. *red=r[8];
  209. *green=g[8];
  210. *blue=b[8];
  211. break;
  212. }
  213. */
  214. // 新的算法,几乎快了3倍^_^
  215. for(int k=0;k<9;k++)
  216. {
  217. dwMedianList[k]=(r[k]*30+g[k]*59+b[k]*11)/100;
  218. }
  219. for( i=1; i<9; i++ )
  220. {
  221. for( j=0; j<i; j++ )
  222. {
  223. if( dwMedianList[i] < dwMedianList[j] )
  224. {
  225. DWORD dwTmp;
  226. int nTmp;
  227. dwTmp = dwMedianList[i];
  228. nTmp = dwAddList[i];
  229. for( k=i; k>j; k-- )
  230. {
  231. dwMedianList[k] = dwMedianList[k-1];
  232. dwAddList[k] = dwAddList[k-1];
  233. }
  234. dwMedianList[j] = dwTmp;
  235. dwAddList[j] = nTmp;
  236. break;
  237. }
  238. }
  239. }
  240. switch(nStype)
  241. {
  242. case 0:
  243. *blue=*(lpData+dwAddList[4]++);
  244. *green=*(lpData+dwAddList[4]++);
  245. *red=*(lpData+dwAddList[4]);
  246. break;
  247. case 1:
  248. *blue=*(lpData+dwAddList[0]++);
  249. *green=*(lpData+dwAddList[0]++);
  250. *red=*(lpData+dwAddList[0]);
  251. break;
  252. case 2:
  253. *blue=*(lpData+dwAddList[8]++);
  254. *green=*(lpData+dwAddList[8]++);
  255. *red=*(lpData+dwAddList[8]);
  256. break;
  257. }
  258. }
  259. BOOL _fnCOM_MedianFilter(LPIMAGEPROCSTR lpInfo,int nPels,int nStype)
  260. {
  261. CopyMemory(lpInfo->_pdbdata ,lpInfo->_psbdata ,lpInfo->sImageInfo.width*lpInfo->sImageInfo.height*(lpInfo->sImageInfo.bitperpix/8));
  262. WORD skip=lpInfo->sImageInfo .byteperline ;
  263. UINT i,j;
  264. for(i=1;i<(UINT)lpInfo->sImageInfo.height-1;i++)
  265. {
  266. for(j=1;j<(UINT)lpInfo->sImageInfo.width-1;j++)
  267. {
  268. int red=0,green=0,blue=0;
  269. _fnSPE_MedianFilter(&red,&green,&blue,i,j,1,skip,lpInfo->_psbdata,nStype);
  270. LONG lOffset=(LONG)(i*skip)+(LONG)(j*4);
  271. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((blue)<(0)?(0):((blue)>(255)?(255):(blue)));
  272. *(lpInfo->_pdbdata+lOffset++)=(BYTE)((green)<(0)?(0):((green)>(255)?(255):(green)));
  273. *(lpInfo->_pdbdata+lOffset)=(BYTE)((red)<(0)?(0):((red)>(255)?(255):(red)));
  274. }
  275. }
  276. return PROCERR_SUCCESS;
  277. }