BianTiDib.cpp
Upload User: szkelitina
Upload Date: 2022-05-21
Package Size: 6797k
Code Size: 19k
Category:

Special Effects

Development Platform:

Visual C++

  1. #include "stdafx.h"
  2. #include "windowsx.h"
  3. #include "math.h"
  4. #include "BianTiDib.h"
  5. #include "MainFrm.h"
  6. #include "DynSplitView2.h"
  7.  
  8.  
  9. BianTiDib::BianTiDib()
  10. {
  11.  
  12. }
  13. BianTiDib::~BianTiDib()
  14. {
  15. }
  16.  
  17. ///***************************************************************/           
  18. /*函数名称:Xihua()                                       
  19. /*函数类型:void                                      
  20. /*功能:对图像进行细化处理。            
  21. /***************************************************************/
  22. void BianTiDib::Xihua()
  23. {
  24.    // 循环变量
  25. LONG i;
  26. LONG j;
  27. LONG m;
  28. LONG n;
  29. // 5×5相邻区域像素值
  30. unsigned char S[5][5];
  31. // 计数器
  32. unsigned char Num;
  33. // 循环跳出标志
  34. BOOL fp=TRUE;
  35. // 指向DIB象素指针
  36. LPBYTE  p_data;
  37. // 指向源图像的指针
  38. LPBYTE lpSrc;
  39. // 指向缓存图像的指针
  40. LPBYTE lpDst;
  41. // 指向缓存DIB图像的指针
  42. LPBYTE temp;
  43. // 找到DIB图像象素起始位置
  44. p_data = this->GetData ();  
  45.     if(m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  46. // DIB的宽度
  47. LONG wide = this->GetWidth ();
  48. // DIB的高度
  49. LONG height = this->GetHeight ();
  50. // 暂时分配内存,以保存新图像
  51. temp = new BYTE [wide *height];
  52. // 初始化新分配的内存,设定初始值为255
  53. lpDst = temp;
  54. memset(lpDst, (BYTE)255, wide  * height);
  55. while (fp)
  56. {
  57. fp = FALSE;
  58. // 初始化新分配的内存,设定初始值为255
  59. lpDst = temp;
  60. memset(lpDst, (BYTE)255, wide  * height);
  61. // 由于使用5×5的结构元素,为防越界,不处理外围的2行、2列像素
  62. for (j = 2; j < height - 2; j++)
  63. {
  64. for (i = 2 ; i < wide  - 2 ; i ++)
  65. {
  66. // 指向源图像倒数第j行,第i个象素的指针
  67. lpSrc = (LPBYTE)(p_data + wide  *j + i);
  68. // 指向目标图像倒数第j行,第i个象素的指针
  69. lpDst = (LPBYTE)(temp + wide  * j + i);
  70. // 如果源图像中当前点为白色,则跳过
  71. if (*lpSrc > 127)
  72. continue;
  73. // 获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
  74. for (m = 0; m < 5; m++)
  75. {
  76. for (n = 0; n < 5; n++)
  77. {
  78. if (*(lpSrc + (2- m) * wide  + (n - 2)*2 ) > 127)
  79. S[m][n] = 0;
  80. else
  81. S[m][n] = 1;
  82. }
  83. }
  84. // 判断条件一是否成立:
  85. Num =  S[1][1] + S[1][2] + S[1][3] + S[2][1] 
  86. + S[2][3] + S[3][1] + S[3][2] + S[3][3];
  87. if (Num < 2 || Num >6)
  88. {
  89. *lpDst = 0;
  90. continue;
  91. }
  92. // 判断条件二是否成立:
  93. Num = 0;
  94. if (S[1][2] == 0 && S[1][1] == 1) 
  95. Num++;
  96. if (S[1][1] == 0 && S[2][1] == 1)
  97. Num++;
  98. if (S[2][1] == 0 && S[3][1] == 1)
  99. Num++;
  100. if (S[3][1] == 0 && S[3][2] == 1)
  101. Num++;
  102. if (S[3][2] == 0 && S[3][3] == 1)
  103. Num++;
  104. if (S[3][3] == 0 && S[2][3] == 1)
  105. Num++;
  106. if (S[2][3] == 0 && S[1][3] == 1)
  107. Num++;
  108. if (S[1][3] == 0 && S[1][2] == 1)
  109. Num++;
  110. if (Num != 1)
  111. {
  112. *lpDst = 0;
  113. continue;
  114. }
  115. // 判断条件三是否成立;
  116. if (S[1][2] * S[2][1] * S[2][3] != 0)
  117. {
  118. Num = 0;
  119. if (S[0][2] == 0 && S[0][1] == 1)
  120. Num++;
  121. if (S[0][1] == 0 && S[1][1] == 1)
  122. Num++;
  123. if (S[1][1] == 0 && S[2][1] == 1)
  124. Num++;
  125. if (S[2][1] == 0 && S[2][2] == 1)
  126. Num++;
  127. if (S[2][2] == 0 && S[2][3] == 1)
  128. Num++;
  129. if (S[2][3] == 0 && S[1][3] == 1)
  130. Num++;
  131. if (S[1][3] == 0 && S[0][3] == 1)
  132. Num++;
  133. if (S[0][3] == 0 && S[0][2] == 1)
  134. Num++;
  135. if (Num == 1)
  136. {
  137. *lpDst = 0;
  138. continue;
  139. }
  140. }
  141. // 判断条件四是否成立:
  142. if (S[1][2] * S[2][1] * S[3][2] != 0)
  143. {
  144. Num = 0;
  145. if (S[1][1] == 0 && S[1][0] == 1)
  146. Num++;
  147. if (S[1][0] == 0 && S[2][0] == 1)
  148. Num++;
  149. if (S[2][0] == 0 && S[3][0] == 1)
  150. Num++;
  151. if (S[3][0] == 0 && S[3][1] == 1)
  152. Num++;
  153. if (S[3][1] == 0 && S[3][2] == 1)
  154. Num++;
  155. if (S[3][2] == 0 && S[2][2] == 1)
  156. Num++;
  157. if (S[2][2] == 0 && S[1][2] == 1)
  158. Num++;
  159. if (S[1][2] == 0 && S[1][1] == 1)
  160. Num++;
  161. if (Num == 1)
  162. {
  163. *lpDst = 0;
  164. continue;
  165. }
  166. }
  167. // 如果条件均满足则删除该点
  168. *lpDst = 255;
  169. fp = TRUE;
  170. }
  171. }
  172. // 复制细化后的图像
  173. memcpy(p_data, temp, wide  * height);
  174. }
  175.  // 复制细化后的图像
  176. memcpy(p_data, temp, wide  * height);
  177. // 释放内存
  178. delete temp ;
  179. }
  180. else//24位真彩色
  181. {
  182. // DIB的宽度
  183. LONG wide = this->GetDibWidthBytes();
  184. // DIB的高度
  185. LONG height = this->GetHeight ();
  186. // 暂时分配内存,以保存新图像
  187. temp = new BYTE [wide *height];
  188. // 初始化新分配的内存,设定初始值为255
  189. lpDst = temp;
  190. memset(lpDst, (BYTE)255, wide  * height);
  191. while (fp)
  192. {
  193. fp = FALSE;
  194. // 初始化新分配的内存,设定初始值为255
  195. lpDst = temp;
  196. memset(lpDst, (BYTE)255, wide  * height);
  197. // 由于使用5×5的结构元素,为防越界,不处理外围的2行、2列像素
  198. for (j = 2; j < height - 2; j++)
  199. {
  200. for (i = 2 *3; i < wide  - 2 *3; i=i +3)
  201. {
  202. // 指向源图像倒数第j行,第i个象素的指针
  203. lpSrc = (LPBYTE)(p_data + wide  *j + i);
  204. // 指向目标图像倒数第j行,第i个象素的指针
  205. lpDst = (LPBYTE)(temp + wide  * j + i);
  206. // 如果源图像中当前点为白色,则跳过
  207. if (*lpSrc > 245)
  208. continue;
  209. // 获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
  210. for (m = 0; m < 5; m++)
  211. {
  212. for (n = 0; n < 5; n++)
  213. {
  214. if (*(lpSrc + (2- m) * wide  + (n - 2)*3 ) > 245)
  215. S[m][n] = 0;
  216. else
  217. S[m][n] = 1;
  218. }
  219. }
  220. // 判断条件一是否成立:
  221. Num =  S[1][1] + S[1][2] + S[1][3] + S[2][1] 
  222. + S[2][3] + S[3][1] + S[3][2] + S[3][3];
  223. if (Num < 2 || Num >6)
  224. {
  225. *lpDst = 0;
  226. *(lpDst+1) = 0;
  227. *(lpDst+2) = 0;
  228. continue;
  229. }
  230. // 判断条件二是否成立:
  231. Num = 0;
  232. if (S[1][2] == 0 && S[1][1] == 1) 
  233. Num++;
  234. if (S[1][1] == 0 && S[2][1] == 1)
  235. Num++;
  236. if (S[2][1] == 0 && S[3][1] == 1)
  237. Num++;
  238. if (S[3][1] == 0 && S[3][2] == 1)
  239. Num++;
  240. if (S[3][2] == 0 && S[3][3] == 1)
  241. Num++;
  242. if (S[3][3] == 0 && S[2][3] == 1)
  243. Num++;
  244. if (S[2][3] == 0 && S[1][3] == 1)
  245. Num++;
  246. if (S[1][3] == 0 && S[1][2] == 1)
  247. Num++;
  248. if (Num != 1)
  249. {
  250. *lpDst = 0;
  251. *(lpDst+1) = 0;
  252. *(lpDst+2) = 0;
  253. continue;
  254. }
  255. // 判断条件三是否成立;
  256. if (S[1][2] * S[2][1] * S[2][3] != 0)
  257. {
  258. Num = 0;
  259. if (S[0][2] == 0 && S[0][1] == 1)
  260. Num++;
  261. if (S[0][1] == 0 && S[1][1] == 1)
  262. Num++;
  263. if (S[1][1] == 0 && S[2][1] == 1)
  264. Num++;
  265. if (S[2][1] == 0 && S[2][2] == 1)
  266. Num++;
  267. if (S[2][2] == 0 && S[2][3] == 1)
  268. Num++;
  269. if (S[2][3] == 0 && S[1][3] == 1)
  270. Num++;
  271. if (S[1][3] == 0 && S[0][3] == 1)
  272. Num++;
  273. if (S[0][3] == 0 && S[0][2] == 1)
  274. Num++;
  275. if (Num == 1)
  276. {
  277. *lpDst = 0;
  278. *(lpDst+1) = 0;
  279. *(lpDst+2) = 0;
  280. continue;
  281. }
  282. }
  283. // 判断条件四是否成立:
  284. if (S[1][2] * S[2][1] * S[3][2] != 0)
  285. {
  286. Num = 0;
  287. if (S[1][1] == 0 && S[1][0] == 1)
  288. Num++;
  289. if (S[1][0] == 0 && S[2][0] == 1)
  290. Num++;
  291. if (S[2][0] == 0 && S[3][0] == 1)
  292. Num++;
  293. if (S[3][0] == 0 && S[3][1] == 1)
  294. Num++;
  295. if (S[3][1] == 0 && S[3][2] == 1)
  296. Num++;
  297. if (S[3][2] == 0 && S[2][2] == 1)
  298. Num++;
  299. if (S[2][2] == 0 && S[1][2] == 1)
  300. Num++;
  301. if (S[1][2] == 0 && S[1][1] == 1)
  302. Num++;
  303. if (Num == 1)
  304. {
  305. *lpDst = 0;
  306. *(lpDst+1) = 0;
  307. *(lpDst+2) = 0;
  308. continue;
  309. }
  310. }
  311. // 如果条件均满足则删除该点
  312. *lpDst = 255;
  313. *(lpDst+1) = 255;
  314. *(lpDst+2) = 255;  
  315. fp = TRUE;
  316. }
  317. }
  318. // 复制细化后的图像
  319. memcpy(p_data, temp, wide  * height);
  320. }
  321. // 复制细化后的图像
  322. memcpy(p_data, temp, wide  * height);
  323. // 释放内存
  324. delete temp ;
  325. }
  326. }
  327. ///***************************************************************/           
  328. /*函数名称:Cuhua()                                       
  329. /*函数类型:void                                      
  330. /*功能:对图像进行粗化处理。            
  331. /***************************************************************/
  332. void BianTiDib::Cuhua()
  333. {
  334. // 循环变量
  335. LONG i;
  336. LONG j;
  337. // 指向DIB象素指针
  338. LPBYTE p_data;
  339. // 找到DIB图像象素起始位置
  340. p_data = this->GetData();
  341. if(m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  342. {
  343. // DIB的宽度
  344. LONG wide = GetWidth();
  345. // DIB的高度
  346. LONG height = GetHeight();
  347. // 对各像素进行灰度转换
  348. for (j = 0; j < height; j ++)
  349. {
  350. for (i = 0; i < wide; i ++)
  351. {
  352. // 对像素各颜色分量进行二值化求补处理
  353. unsigned char temp = *((unsigned char *)p_data + wide * j +i);
  354. if (temp > 127)
  355. *((unsigned char *)p_data + wide * j + i) = 0;
  356. else
  357. *((unsigned char *)p_data + wide * j + i) = 255;
  358. }
  359. }
  360. // 在求补后再对图象进行细化
  361. Xihua(); 
  362. }
  363. else//24位真彩色
  364. {
  365. // DIB的宽度
  366. LONG wide = GetDibWidthBytes();
  367. // DIB的高度
  368. LONG height = GetHeight();
  369. // 对各像素进行灰度转换
  370. for (j = 0; j < height; j ++)
  371. {
  372. for (i = 0; i < wide; i ++)
  373. {
  374. // 对像素各颜色分量进行二值化求补处理
  375. unsigned char temp = *((unsigned char *)p_data + wide * j +i);
  376. if (temp > 127)
  377. *((unsigned char *)p_data + wide * j + i) = 0;
  378. else
  379. *((unsigned char *)p_data + wide * j + i) = 255;    
  380. }
  381. }
  382. // 在求补后再对图象进行细化
  383. Xihua(); 
  384. }
  385. }
  386. ///***************************************************************/           
  387. /*函数名称:Zhongzhoubianhuan()                                       
  388. /*函数类型:void                                      
  389. /*功能:对图像进行中轴变换。            
  390. /***************************************************************/
  391. void BianTiDib::Zhongzhoubianhuan()
  392. {
  393. // 循环变量 
  394. LONG i;
  395. LONG j;
  396. LONG m;
  397. LONG n;
  398. // 5×5相邻区域像素值
  399. unsigned char S[5][5];
  400. // 计数器
  401. unsigned char Num;
  402. // 循环跳出标志 
  403. BOOL fp=TRUE;
  404. // 指向DIB象素指针
  405. LPBYTE p_data;
  406. // 指向源图像的指针
  407. LPBYTE lpSrc;
  408. // 指向缓存图像的指针
  409. LPBYTE lpDst;
  410. // 指向缓存DIB图像的指针
  411. LPBYTE temp;
  412. // 找到DIB图像象素起始位置
  413. p_data = GetData();
  414. if(m_pBitmapInfoHeader->biBitCount<9)//灰度图像
  415. {
  416. // DIB的宽度
  417. LONG wide = GetWidth();
  418. // DIB的高度 
  419. LONG height = GetHeight();
  420. // 暂时分配内存,以保存新图像
  421. temp =  new BYTE [wide*height];
  422. // 初始化新分配的内存,设定初始值为255
  423. lpDst = (LPBYTE)temp;
  424. memset(lpDst, (BYTE)255, wide * height);
  425. while (fp)
  426. {
  427. fp = FALSE;
  428. // 初始化新分配的内存,设定初始值为255
  429. lpDst = (LPBYTE)temp;
  430. memset(lpDst, (BYTE)255, wide * height);
  431. // 由于使用5×5的结构元素,为防越界,不处理外围的2行、2列像素
  432. for (j= 2; j < height - 2; j++)
  433. {
  434. for (i = 2  ; i < wide - 2  ; i ++)
  435. {
  436. // 指向源图像倒数第j行,第i个象素的指针
  437. lpSrc = (LPBYTE)(p_data + wide * j + i);
  438. // 指向目标图像倒数第j行,第i个象素的指针
  439. lpDst = (LPBYTE)(temp + wide * j + i);
  440. // 如果源图像中当前点为白色,则跳过
  441. if (*lpSrc > 127)
  442. continue;
  443. // 获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
  444. for (m = 0; m < 5; m++)
  445. {
  446. for (n = 0; n < 5; n++)
  447. {
  448. if (*(lpSrc + (2 - m) * wide + (n - 2)  ) > 127)
  449. S[m][n] = 0;
  450. else
  451. S[m][n] = 1;
  452. }
  453. }
  454. // 判断条件1-1是否成立:
  455. Num =  S[1][1] + S[1][2] + S[1][3] + S[2][1] 
  456. + S[2][3] + S[3][1] + S[3][2] + S[3][3];
  457. if (Num < 2 || Num >6)
  458. {
  459. *lpDst = 0;  
  460. continue;
  461. }
  462. // 判断条件1-2是否成立:
  463. Num = 0;
  464. if (S[1][2] == 0 && S[1][1] == 1) 
  465. Num++;
  466. if (S[1][1] == 0 && S[2][1] == 1)
  467. Num++;
  468. if (S[2][1] == 0 && S[3][1] == 1)
  469. Num++;
  470. if (S[3][1] == 0 && S[3][2] == 1)
  471. Num++;
  472. if (S[3][2] == 0 && S[3][3] == 1)
  473. Num++;
  474. if (S[3][3] == 0 && S[2][3] == 1)
  475. Num++;
  476. if (S[2][3] == 0 && S[1][3] == 1)
  477. Num++;
  478. if (S[1][3] == 0 && S[1][2] == 1)
  479. Num++;
  480. if (Num != 1)
  481. {
  482. *lpDst = 0;  
  483. continue;
  484. }
  485. // 判断条件1-3是否成立;
  486. if (S[1][2] * S[2][1] * S[3][2] != 0)
  487. {
  488. *lpDst = 0;  
  489. continue;
  490. }
  491. // 判断条件1-4是否成立:
  492. if (S[2][1] * S[3][2] * S[2][3] != 0)
  493. {
  494. *lpDst = 0;  
  495. continue;
  496. }
  497. // 如果条件均满足则删除该点
  498. *lpDst = 255;  
  499. }
  500. }
  501. // 由于使用5×5的结构元素,为防越界,不处理外围的2行、2列像素
  502. for (j = 2; j < height - 2; j++)
  503. {
  504. for (i = 2  ; i < wide - 2  ; i ++)
  505. {
  506. // 指向源图像倒数第j行,第i个象素的指针
  507. lpSrc = (LPBYTE)(p_data + wide * j + i);
  508. // 指向目标图像倒数第j行,第i个象素的指针
  509. lpDst = (LPBYTE)(temp + wide *j + i);
  510. // 如果源图像中当前点为白色,则跳过
  511. if (*lpSrc > 127)
  512. continue;
  513. // 获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
  514. for (m = 0; m < 5; m++)
  515. {
  516. for (n = 0; n < 5; n++)
  517. {
  518. if (*(lpSrc + (2 - m) * wide + (n - 2)  ) > 200)
  519. S[m][n] = 0;
  520. else
  521. S[m][n] = 1;
  522. }
  523. }
  524. // 判断条件2-1是否成立:
  525. Num =  S[1][1] + S[1][2] + S[1][3] + S[2][1] 
  526. + S[2][3] + S[3][1] + S[3][2] + S[3][3];
  527. if (Num < 2 || Num >6)
  528. {
  529. *lpDst = 0;  
  530. continue;
  531. }
  532. // 判断条件2-2是否成立:
  533. Num = 0;
  534. if (S[1][2] == 0 && S[1][1] == 1) 
  535. Num++;
  536. if (S[1][1] == 0 && S[2][1] == 1)
  537. Num++;
  538. if (S[2][1] == 0 && S[3][1] == 1)
  539. Num++;
  540. if (S[3][1] == 0 && S[3][2] == 1)
  541. Num++;
  542. if (S[3][2] == 0 && S[3][3] == 1)
  543. Num++;
  544. if (S[3][3] == 0 && S[2][3] == 1)
  545. Num++;
  546. if (S[2][3] == 0 && S[1][3] == 1)
  547. Num++;
  548. if (S[1][3] == 0 && S[1][2] == 1)
  549. Num++;
  550. if (Num != 1)
  551. {
  552. *lpDst = 0;  
  553. continue;
  554. }
  555. // 判断条件2-3是否成立;
  556. if (S[1][2] * S[2][1] * S[2][3] != 0)
  557. {
  558. *lpDst = 0;  
  559. continue;
  560. }
  561. // 判断条件2-4是否成立:
  562. if (S[1][2] * S[3][2] * S[2][3] != 0)
  563. {
  564. *lpDst = 0;  
  565. continue;
  566. }
  567. // 如果条件均满足则删除该点
  568. *lpDst = 255;  
  569. fp = TRUE;
  570. }
  571. }
  572. // 复制变换后的图像
  573. memcpy(p_data, temp, wide * height);
  574. }
  575. // 复制变换后的图像
  576. memcpy(p_data, temp, wide * height);
  577. //  释放内存
  578. delete temp; 
  579. }
  580. else//24位真彩色
  581. {
  582. // DIB的宽度
  583. LONG wide = GetDibWidthBytes();
  584. // DIB的高度 
  585. LONG height = GetHeight();
  586. // 暂时分配内存,以保存新图像
  587. temp =  new BYTE [wide*height];
  588. // 初始化新分配的内存,设定初始值为255
  589. lpDst = (LPBYTE)temp;
  590. memset(lpDst, (BYTE)255, wide * height);
  591. while (fp)
  592. {
  593. fp = FALSE;
  594. // 初始化新分配的内存,设定初始值为255
  595. lpDst = (LPBYTE)temp;
  596. memset(lpDst, (BYTE)255, wide * height);
  597. // 由于使用5×5的结构元素,为防越界,不处理外围的2行、2列像素
  598. for (j= 2; j < height - 2; j++)
  599. {
  600. for (i = 2*3  ; i < wide - 2 *3 ; i =i+3)
  601. {
  602. // 指向源图像倒数第j行,第i个象素的指针
  603. lpSrc = (LPBYTE)(p_data + wide * j + i);
  604. // 指向目标图像倒数第j行,第i个象素的指针
  605. lpDst = (LPBYTE)(temp + wide * j + i);
  606. // 如果源图像中当前点为白色,则跳过
  607. if (*lpSrc > 127)
  608. continue;
  609. // 获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
  610. for (m = 0; m < 5; m++)
  611. {
  612. for (n = 0; n < 5; n++)
  613. {
  614. if (*(lpSrc + (2 - m) * wide + (n - 2) *3 ) > 200)
  615. S[m][n] = 0;
  616. else
  617. S[m][n] = 1;
  618. }
  619. }
  620. // 判断条件1-1是否成立:
  621. Num =  S[1][1] + S[1][2] + S[1][3] + S[2][1] 
  622. + S[2][3] + S[3][1] + S[3][2] + S[3][3];
  623. if (Num < 2 || Num >6)
  624. {
  625. *lpDst = 0;
  626. *(lpDst+1) = 0;
  627. *(lpDst+2) = 0;
  628. continue;
  629. }
  630. // 判断条件1-2是否成立:
  631. Num = 0;
  632. if (S[1][2] == 0 && S[1][1] == 1) 
  633. Num++;
  634. if (S[1][1] == 0 && S[2][1] == 1)
  635. Num++;
  636. if (S[2][1] == 0 && S[3][1] == 1)
  637. Num++;
  638. if (S[3][1] == 0 && S[3][2] == 1)
  639. Num++;
  640. if (S[3][2] == 0 && S[3][3] == 1)
  641. Num++;
  642. if (S[3][3] == 0 && S[2][3] == 1)
  643. Num++;
  644. if (S[2][3] == 0 && S[1][3] == 1)
  645. Num++;
  646. if (S[1][3] == 0 && S[1][2] == 1)
  647. Num++;
  648. if (Num != 1)
  649. {
  650. *lpDst = 0;
  651. *(lpDst+1) = 0;
  652. *(lpDst+2) = 0;
  653. continue;
  654. }
  655. // 判断条件1-3是否成立;
  656. if (S[1][2] * S[2][1] * S[3][2] != 0)
  657. {
  658. *lpDst = 0;
  659. *(lpDst+1) = 0;
  660. *(lpDst+2) = 0;
  661. continue;
  662. }
  663. // 判断条件1-4是否成立:
  664. if (S[2][1] * S[3][2] * S[2][3] != 0)
  665. {
  666. *lpDst = 0;
  667. *(lpDst+1) = 0;
  668. *(lpDst+2) = 0;
  669. continue;
  670. }
  671. // 如果条件均满足则删除该点
  672. *lpDst = 255;
  673. *(lpDst+1) = 255;
  674. *(lpDst+2) = 255;
  675. }
  676. }
  677. // 由于使用5×5的结构元素,为防越界,不处理外围的2行、2列像素
  678. for (j = 2; j < height - 2; j++)
  679. {
  680. for (i = 2*3  ; i < wide - 2*3  ; i=i +3)
  681. {
  682. // 指向源图像倒数第j行,第i个象素的指针
  683. lpSrc = (LPBYTE)(p_data + wide * j + i);
  684. // 指向目标图像倒数第j行,第i个象素的指针
  685. lpDst = (LPBYTE)(temp + wide *j + i);
  686. // 如果源图像中当前点为白色,则跳过
  687. if (*lpSrc > 127)
  688. continue;
  689. // 获得当前点相邻的5×5区域内像素值,白色用0代表,黑色用1代表
  690. for (m = 0; m < 5; m++)
  691. {
  692. for (n = 0; n < 5; n++)
  693. {
  694. if (*(lpSrc + (2 - m) * wide + (n - 2)*3  ) > 200)
  695. S[m][n] = 0;
  696. else
  697. S[m][n] = 1;
  698. }
  699. }
  700. // 判断条件2-1是否成立:
  701. Num =  S[1][1] + S[1][2] + S[1][3] + S[2][1] 
  702. + S[2][3] + S[3][1] + S[3][2] + S[3][3];
  703. if (Num < 2 || Num >6)
  704. {
  705. *lpDst = 0;
  706. *(lpDst+1) = 0;
  707. *(lpDst+2) = 0;
  708. continue;
  709. }
  710. // 判断条件2-2是否成立:
  711. Num = 0;
  712. if (S[1][2] == 0 && S[1][1] == 1) 
  713. Num++;
  714. if (S[1][1] == 0 && S[2][1] == 1)
  715. Num++;
  716. if (S[2][1] == 0 && S[3][1] == 1)
  717. Num++;
  718. if (S[3][1] == 0 && S[3][2] == 1)
  719. Num++;
  720. if (S[3][2] == 0 && S[3][3] == 1)
  721. Num++;
  722. if (S[3][3] == 0 && S[2][3] == 1)
  723. Num++;
  724. if (S[2][3] == 0 && S[1][3] == 1)
  725. Num++;
  726. if (S[1][3] == 0 && S[1][2] == 1)
  727. Num++;
  728. if (Num != 1)
  729. {
  730. *lpDst = 0;
  731. *(lpDst+1) = 0;
  732. *(lpDst+2) = 0;
  733. continue;
  734. }
  735. // 判断条件2-3是否成立;
  736. if (S[1][2] * S[2][1] * S[2][3] != 0)
  737. {
  738. *lpDst = 0;
  739. *(lpDst+1) = 0;
  740. *(lpDst+2) = 0;
  741. continue;
  742. }
  743. // 判断条件2-4是否成立:
  744. if (S[1][2] * S[3][2] * S[2][3] != 0)
  745. {
  746. *lpDst = 0;
  747. *(lpDst+1) = 0;
  748. *(lpDst+2) = 0;
  749. continue;
  750. }
  751. // 如果条件均满足则删除该点
  752. *lpDst = 255;
  753. *(lpDst+1) = 255;
  754. *(lpDst+2) = 255;
  755. fp = TRUE;
  756. }
  757. }
  758. // 复制变换后的图像
  759. memcpy(p_data, temp, wide * height);
  760. }
  761. // 复制变换后的图像
  762. memcpy(p_data, temp, wide * height);
  763. //  释放内存
  764. delete temp; 
  765. }
  766. }
  767.