當前位置:首頁 » 編程語言 » c語言圖像過濾器
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言圖像過濾器

發布時間: 2023-07-08 19:07:29

1. c語言將圖像轉化為灰度圖像,並將灰度圖像像素值存入二維數組

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main(){
img = imread("./lena.png");
cvtColor(img, img, CV_BGR2GRAY);
uchar** pixmat = new uchar*[img.rows];
for(int i = 0; i < img.rows; i++){
pixmat[i] = new uchar[img.cols];
for(int j = 0; j < img.cols; j++){
pixmat[i][j] = img.at<uchar>(i, j);
}}}
//pixmat is demanded 2-D array

2. 純C語言實現圖像處理

這個不難吧?雖然我不用c,可是說下怎麼做,首先打開一個BMP文件,然後按照bmp格式解析到一個數組中,接著進行二值化(這個有很多方法),最後將數組中的數據寫入一個新的BMP文件就可以了。

3. c語言數字圖像處理怎麼顯示一張照片的像素值

#include <stdio.h>
#include <windows.h>
int main()
{
//變數
char title[255];//用於存放控制台窗口標題
HWND hwnd;//窗口的句柄,H:Handle
HDC hdc, hmemdc;//設備上下文句柄,DC:driver context
HBITMAP hbm;//圖片的句柄
BITMAP bm;//圖片結構體
RECT rect;//矩形 rectangle
//把控制台窗口調成100字元寬度,40行
system("mode con cols=100 lines=40");

//1.取得窗口的句柄
GetConsoleTitleA(title, 255);//獲取控制台窗口的標題
hwnd = FindWindowA(NULL, title);//通過窗口標題取得該窗口的句柄
//獲取窗口的高度和寬度
GetWindowRect(hwnd, &rect);
//2. 獲取畫筆
hdc = GetDC(hwnd);
/* if(!hdc)
printf("No val\n");
else
printf("have\n");
TextOutA(hdc, 300, 400, "Hello world", strlen("Hello world"));*/
hmemdc = CreateCompatibleDC(hdc);//創建一個兼容的DC
//3.載入圖片
hbm = (HBITMAP)LoadImageA(NULL, "123.bmp", IMAGE_BITMAP, 0, 0,
LR_LOADFROMFILE);
GetObject(hbm, sizeof(BITMAP), &bm);//得到圖片信息
//4.把圖片放入兼容DC中
SelectObject(hmemdc, hbm);

//5.在窗口上畫出圖片
BitBlt(hdc, 0, 0, bm.bmWidth, bm.bmHeight, hmemdc, 0, 0, SRCCOPY);

DeleteObject(hbm);
DeleteObject(hmemdc);
ReleaseDC(hwnd, hdc);
return 0;
}

4. c語言 圖像取反

#include<iostream>
#pragma pack (1)
using namespace std;
#define LONG unsigned long int
#define DWORD unsigned long int
#define WORD unsigned __int16
typedef struct _bmphead
{
WORD bfType; // 點陣圖文件的類型,必須為BM(0-1位元組)
DWORD bfSize; // 點陣圖文件的大小,以位元組為單位(2-5位元組)
WORD bfReserved1; // 點陣圖文件保留字,必須為0(6-7位元組)
WORD bfReserved2; // 點陣圖文件保留字,必須為0(8-9位元組)
DWORD bfOffBits; // 點陣圖數據的起始位置,以相對於點陣圖(10-13位元組)
// 文件頭的偏移量表示,以位元組為單位
DWORD biSize; // 本結構所佔用位元組數(14-17位元組)
LONG biWidth; // 點陣圖的寬度,以像素為單位(18-21位元組)
LONG biHeight; // 點陣圖的高度,以像素為單位(22-25位元組)
WORD biPlanes; // 目標設備的級別,必須為1(26-27位元組)
WORD biBitCount;// 每個像素所需的位數,必須是1(雙色),(28-29位元組)
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 點陣圖壓縮類型,必須是 0(不壓縮),(30-33位元組)
// 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
DWORD biSizeImage; // 點陣圖的大小,以位元組為單位(34-37位元組)
LONG biXPelsPerMeter; // 點陣圖水平解析度,每米像素數(38-41位元組)
LONG biYPelsPerMeter; // 點陣圖垂直解析度,每米像素數(42-45位元組)
DWORD biClrUsed;// 點陣圖實際使用的顏色表中的顏色數(46-49位元組)
DWORD biClrImportant;// 點陣圖顯示過程中重要的顏色數(50-53位元組)
} bmphead,*phead;

class bmp
{
private:
FILE *fp;
bmphead head;
unsigned char *buffer;
unsigned char *templete;
bool fileopened;
int pad;
public:
void open(char *FileName)
{
fileopened=false;
fp=NULL;
fp=fopen(FileName,"rb");
if(!fp)
{
cout<<"Can`t open file:"<<FileName<<endl;
return;
}
fileopened=true;
fread(&head,1,sizeof(bmphead),fp);
if(head.biBitCount!=8)
{
cout<<FileName<<"is not a gray graphic."<<endl;
return;
}
pad=(4-head.biWidth%4)%4;
buffer=new unsigned char[head.biHeight*(head.biWidth+pad)];
templete=new unsigned char[1024];
fread(templete,1024,1,fp);
fread(buffer,head.biHeight*(head.biWidth+pad),1,fp);
fclose(fp);
fileopened=true;
}
void reverse()
{
if(!fileopened)
{
cout<<"Empty class"<<endl;
return;
}
int i,j;
for(i=0;i<head.biHeight;i++)
for(j=0;j<head.biWidth;j++)
*(buffer+i*(head.biWidth+pad)+j)=0xFF-*(buffer+i*(head.biWidth+pad)+j);
}
void save(char *FileName)
{
fp=NULL;
fp=fopen(FileName,"wb");
if(!fp)
{
cout<<"Can`t open file:"<<FileName<<endl;
return;
}
fwrite(&head,1,sizeof(bmphead),fp);
fwrite(templete,1024,1,fp);
fwrite(buffer,head.biHeight*(head.biWidth+pad),1,fp);
fclose(fp);
}
};

void main(void)
{
bmp a;
char str[100];
cout<<"Input the bmp file name:"<<endl;
cin>>str;
a.open(str);
a.reverse();
cout<<"Save as file name:"<<endl;
cin>>str;
a.save(str);
system("pause");

}

5. 求助C語言讀取灰度圖像並轉換為二維數組完整代碼

1、步驟大概這樣第一步:讀取圖像數據到內存第二步:讀取文件頭第三步:讀取信息頭第四步:讀取圖像矩陣到二維數組2、常式:

FileName=fileDlg.GetFileName ();FILE *fp=fopen(FileName,"rb");//二進制讀方式打開指定的圖像文件fread(&FileHead, sizeof(BITMAPFILEHEADER), 1,fp); //讀取文件頭,文件指針自動後移fread(&InfoHead, sizeof(BITMAPINFOHEADER), 1,fp);//讀取信息頭,文件指針自動後移//獲取圖像寬、高、每像素所佔位數等信息bmpWidth = InfoHead.biWidth;bmpHeight = InfoHead.biHeight;//下面完成圖像數據向內存數組的存儲ImageData=new unsigned char*[bmpHeight];if(InfoHead.biBitCount==24){for (int i=0;i<bmpHeight;i++){ImageData[i]=new unsigned char[(bmpWidth*3+3)/4*4];}for (int k=0;k<bmpHeight;k++ ){for(int j=0;j<(bmpWidth*3+3)/4*4;j++){fread(&ImageData[k][j],1,1,fp);//上面完成動態二維數組的申請,這里實際讀取圖像數據}}fclose(fp);//關閉文件

6. 求用C語言用Sobels運算元方法編寫圖像邊緣提取的程序演算法!(急)

定義:每個像素的取值均為0或1,稱這樣的圖像為二值圖像。

演算法:檢查所有像素,若該像素為物體上與背景接觸的像素(四連通像素中既有背景像素又有物體像素),則為邊界。

程序:

#define M 30
#define N 20

void edge(int image[M][N],int bianyuan[M][N])
{
int i,j;
int inner=1,outer=1;
for (i=0;i<M;i++)/*清除數據*/
for(j=0;j<N;j++)
bianyuan[i][j]=0;
for(i=1;i<M-1;i++)
for(j=1;j<N-1;j++)
{
inner=1;/*假設該像素或為物體,或為背景*/
outer=1;
if(image[i-1][j]==0||image[i+1][j]==0||image[i][j-1]==0||image[i][j+1]==0)
inner=0;
if(image[i-1][j]==1||image[i+1][j]==1||image[i][j-1]==1||image[i][j+1]==1)
outer=0;
if(inner==0&&outer==0&&image[i][j]==1)/*像素周圍既有物體又有背景*/ bianyuan[i][j]=1;/*,且該像素為物體上的像素(image[i][j]==1),則定義為邊界*/
}
}

void output(int array[M][N],int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<N;j++)
if(array[i][j]==1)
printf("1");
else
printf(" ");
}
}

void main()
{
int image[M][N]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,0},
{0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0},
{0,0,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0},
{0,0,1,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0},
{0,1,1,1,1,1,1,0,0,1,1,1,0,0,1,1,1,1,0},
{0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0},
{0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,0},
{0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,0},
{0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0}};
int bianyuan[M][N]={0};
int i,j;
printf("\nThe origianl image is:\n");
output(image,10);
edge(image,bianyuan);
printf("\nIts edge is:\n");
output(bianyuan,10);
}

寫完了,又看一下,感覺edge函數太羅嗦了,不夠簡練,想了一下,改成了下面的樣子,函數介面不變:

void edge(int image[M][N],int bianyuan[M][N])
{
int i,j;
for (i=0;i<M;i++)
for(j=0;j<N;j++)
bianyuan[i][j]=0;
for(i=1;i<M-1;i++)
for(j=1;j<N-1;j++)
{
int t=image[i-1][j]+image[i+1][j]+image[i][j-1]+image[i][j+1];
if(t>0&&t<4&&image[i][j]==1)/*周圍4個像素值介於1~3之間,*/
bianyuan[i][j]=1; /*且當前像素為物體,則其必為邊界*/
}
}

希望這段代碼對你有所幫助

7. C語言中,圖像處理函數的使用

Tc中用initgraph()函數可以切換到圖形模式,用closegraph()可以從圖形模式切換回字元模式。

initgraph()和closegraph()都是圖形函數,使用圖形函數必須包括頭文件"graphics.h"。

void far i nitgraph(int far *graphdriver, int far *graphmode,char far *pathtodriver);

graphdriver是指向圖形驅動序號變數的指針,
graphmode是在graphdriver選定後,指向圖形顯示模式序號變數的指針,
pathtodriver表示存放圖形驅動文件的路徑。
圖形驅動序號不同,圖形驅動文件也不同。序號為VGA圖形驅動對應"egavga.bgi"這個圖形驅動文件。
"egavga.bgi"一般在 Tc目錄下

例如:
-------
#include <graphics.h>

int Drive,Mode=DETECT;
initgraph(&Drive,&Mode,""); //圖形顯示器、顯示模式、路徑自動檢測

運行時需要在當前目錄下存在 EGAVGA.BGI文件
在TC\BGI目錄底下

-------
如果編譯後的.exe文件在另外一個目錄(如編譯後的.exe文件在D:\MyTc 目錄下,而編譯器的程序和.BGI文件在C:\Turboc\bin 目錄下,則需要填上BGI文件的路徑
例如:
initgraph(&Drive,&Mode,"C:\\Turboc\\bgi");

8. 如何用C語言對圖像加入高斯雜訊和椒鹽雜訊

自己產生[x,y] 2維隨機數,用分布函數為權,取用點的個數就可以了。如考慮中心對稱,用極座標[r,sita] 也許更方便。

2維椒鹽雜訊,即產生[x,y,1] 和 [x,y,0], 1 是白點,0是黑點。

計算機的偽隨機數,就是白雜訊,均勻分布。