C語言實(shí)現(xiàn)BMP圖像閉運(yùn)算處理
閉運(yùn)算可以把比結(jié)構(gòu)元素小的特定圖像細(xì)節(jié)出去,同時(shí)保證不產(chǎn)生全局的幾何失真。填充比結(jié)構(gòu)元素小的缺口或孔,搭接短的間斷而起到連接作用。
運(yùn)算:也就是先膨脹后腐蝕。
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int main(int* argc, char** argv)
{
FILE* fp = fopen("./threshold.bmp", "rb");
if (fp == 0)
return 0;
BITMAPFILEHEADER fileHead;
fread(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);
BITMAPINFOHEADER infoHead;
fread(&infoHead, sizeof(BITMAPINFOHEADER), 1, fp);
int width = infoHead.biWidth;
int height = infoHead.biHeight;
int biCount = infoHead.biBitCount;
int lineByte = (biCount*width / 8 + 3) / 4 * 4;
RGBQUAD* pColorTable;
pColorTable = new RGBQUAD[256];
fread(pColorTable, sizeof(RGBQUAD), 256, fp);
unsigned char* pBmpBuf;
pBmpBuf = new unsigned char[lineByte*height];
fread(pBmpBuf, lineByte*height, 1, fp);
fclose(fp);
// 新圖
FILE* fop = fopen("close.bmp", "wb");
if (fop == 0)
return 0;
// 膨脹操作
// 初始化
int t = 0, d = 0, r = 0;
unsigned char* pBmpBuf2;
pBmpBuf2 = new unsigned char[lineByte*height];
for (int i = 0; i < height; ++i){
for (int j = 0; j < width; ++j){
*(pBmpBuf2 + i*lineByte + j) = 255;
}
}
for (int i = 1; i < height; ++i){
for (int j = 0; j < width - 1; ++j){
t = *(pBmpBuf + i*lineByte + j); // 當(dāng)前點(diǎn)
d = *(pBmpBuf + (i - 1)*lineByte + j); // 下面點(diǎn)
r = *(pBmpBuf + i*lineByte + j + 1); // 右邊點(diǎn)
if (t == 0 && d == 0 && r == 0){
*(pBmpBuf2 + i*lineByte + j) = 0; // 當(dāng)前點(diǎn)
}
}
}
// 結(jié)構(gòu)元素向上反轉(zhuǎn)180度,對最下面一排處理
for (int j = 0; j < width - 1; ++j){
t = *(pBmpBuf + j); // 當(dāng)前點(diǎn)
d = *(pBmpBuf + lineByte + j); // 上面點(diǎn)
r = *(pBmpBuf + j + 1); // 右邊點(diǎn)
if (t == 0 && d == 0 && r == 0){
*(pBmpBuf2 + j) = 0; // 當(dāng)前點(diǎn)
}
}
// 結(jié)構(gòu)元素向右反轉(zhuǎn),對最右邊一列處理
for (int i = 1; i < height; ++i){
t = *(pBmpBuf + i*lineByte + width - 1);
d = *(pBmpBuf + (i - 1)*lineByte + width - 1);
r = *(pBmpBuf + i*lineByte + width - 2);
if (t == 0 && d == 0 && r == 0){
*(pBmpBuf2 + i*lineByte + width - 1) = 0; // 當(dāng)前點(diǎn)
}
}
// 腐蝕操作
for (int i = 1; i < height; ++i){
for (int j = 0; j < width - 1; ++j){
t = *(pBmpBuf2 + i*lineByte + j); // 當(dāng)前點(diǎn)
d = *(pBmpBuf2 + (i - 1)*lineByte + j); // 下面點(diǎn)
r = *(pBmpBuf2 + i*lineByte + j + 1); // 右邊點(diǎn)
if (t == 0 && d != 0){
*(pBmpBuf2 + (i - 1)*lineByte + j) = 0;//下邊的置位1
}
if (t == 0 && r != 0){
*(pBmpBuf2 + i*lineByte + j + 1) = 0;//右邊的置位1
j = j + 1;
}
}
}
fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fop);
fwrite(&infoHead, sizeof(BITMAPINFOHEADER), 1, fop);
fwrite(pColorTable, sizeof(RGBQUAD), 255, fop);
fwrite(pBmpBuf2, lineByte*height, 1, fop);
fclose(fop);
system("pause");
return 0;
}
實(shí)驗(yàn)結(jié)果:
實(shí)驗(yàn)結(jié)果分析:原圖和效果圖略微由區(qū)別。但效果圖似乎和開運(yùn)算相反了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C++中malloc與free、new與delete的詳解與應(yīng)用
今天小編就為大家分享一篇關(guān)于C++中malloc與free、new與delete的詳解與應(yīng)用,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12
C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易網(wǎng)絡(luò)聊天室,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
C++算法學(xué)習(xí)之分支限界法的應(yīng)用
分支限界法常以廣度優(yōu)先或以最小耗費(fèi)(最大效益)優(yōu)先的方式搜索問題的解空間樹。本文將詳細(xì)講解分支限界法的應(yīng)用,需要的可以參考一下2022-05-05

