顯示具有 Image processing 標籤的文章。 顯示所有文章
顯示具有 Image processing 標籤的文章。 顯示所有文章

2013年3月2日

Opencv2:幾種存取像素的方法

此範例為四種Opencv 2存取像素點的方法,使用灰階的例子顯示。

IDE:  Code::Blocks

Complier:  MinGw

OS:  Windows 7

#include<opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<iostream>
void grayM1(cv::Mat &image);
void grayM2(cv::Mat &image);
void grayM3(cv::Mat &image);
void grayM4(cv::Mat &image);
int main()
{
    using namespace std;
    cv::Mat image=cv::imread("D:\\img\\lena_std.bmp");
    grayM1(image);  //使用Mat::at Vec3b模板函數
    //grayM2(image);    //使用Mat::ptr Vec3b模板函數
    //grayM3(image);    //使用Mat::at uchar模板函數
    //grayM4(image);    //使用Mat::data 直接存取Mat memory address
    cv::imshow("img",image);
    cv::waitKey(0);
    cv::destroyWindow("img");
    return 0;
}

void grayM1(cv::Mat &image){
    using namespace cv;
    Vec3b s1,s2;
    for(int i=0;i<image.rows;i++){
        for(int j=0;j<image.cols;j++){
            s1=image.at<Vec3b>(i,j);    //可回傳一個Vec3b的三通道向量
            s2.val[0]=s1.val[0]*0.114+s1.val[1]*0.587+s1.val[2]*0.299;
            image.at<Vec3b>(i,j)[0]=s2.val[0];
            image.at<Vec3b>(i,j)[1]=s2.val[0];
            image.at<Vec3b>(i,j)[2]=s2.val[0];
        }
    }
}

void grayM2(cv::Mat &image){
    using namespace cv;
    Vec3b *s1;
    double result=0;
    for(int i=0;i<image.rows;i++){
        s1=image.ptr<Vec3b>(i); //回傳一個指向該列向量開頭的Vec3b型態指標
        for(int j=0;j<image.cols;j++){
            result=s1[j].val[0]*0.114+s1[j].val[1]*0.587+s1[j].val[2]*0.299;    //存取該行之三通道
            s1[j].val[0]=s1[j].val[1]=s1[j].val[2]=result;
        }
    }
}

void grayM3(cv::Mat &image){
    using namespace cv;
    uchar *s1;
    double result=0;
    for(int i=0;i<image.rows;i++){
        s1=image.ptr<uchar>(i); //回傳一個指向該列向量開頭記憶體位址的uchar型態指標
        for(int j=0;j<image.cols;j++){
            result=s1[j*3]*0.114+s1[j*3+1]*0.587+s1[j*3+2]*0.299;   //排列方式為GBR
            s1[j*3]=s1[j*3+1]=s1[j*3+2]=result;
        }
    }
}

void grayM4(cv::Mat &image){
    using namespace cv;
    double result=0;
    for(int i=0;i<image.rows;i++){
        for(int j=0;j<image.cols;j++){ //image.data為指向該矩陣開頭的記憶體位址+行寬度+列高度+(三通道排列順序)
            result=(*(image.data + (image.step[0] * j + image.step[1] * i)))*0.114+
            (*(image.data + (image.step1(0) * j + image.step1(1) * i)+1))*0.587+
            (*(image.data + (image.step1(0) * j + image.step1(1) * i)+2))*0.299;    //使用* 運算子存取
            *(image.data + (image.step1(0) * j + image.step1(1) * i))=
            *(image.data + (image.step1(0) * j + image.step1(1) * i)+1)=
            *(image.data + (image.step1(0) * j + image.step1(1) * i)+2)=result;
        }
    }
}


結果如下圖:


有錯誤麻煩留言告知 謝謝!!

By Victor

2012年3月13日

影像處理:GRB轉灰階

for(int h=0;hheight;h++)
{
for(int w=0;wwidth;w++)
{
Gravy_Point=cvGet2D(frame,h,w);
for(int i=0;i<3;i++)
{
temp.val[i]=(Gravy_Point.val[0]*0.299)+(Gravy_Point.val[1]*0.587)+(Gravy_Point.val[2]*0.114);
}


cvSet2D(frame,h,w,temp);
}
}

影像處理:八連通遞迴

void __fastcall TForm1::Eight_Adjacency(IplImage *frame,int w,int h,int* Top_Width,int* Top_Height,int* Down_Width,int* Down_Height)
{
temp=cvScalar(0,0,0);
cvSet2D(frame,h,w,temp);
if(w!=frame->width-2)
{
temp=cvGet2D(frame,h,w+1);
if(temp.val[0]==255)
{

Eight_Adjacency(frame,w+1,h,Top_Width,Top_Height,Down_Width,Down_Height);
}
}

if((w!=frame->width-2)&&(h!=frame->height-2))
{
temp=cvGet2D(frame,h+1,w+1);
if(temp.val[0]==255)
{

Eight_Adjacency(frame,w+1,h+1,Top_Width,Top_Height,Down_Width,Down_Height);
}
}
if(h!=frame->height-2)
{
temp=cvGet2D(frame,h+1,w);
if(temp.val[0]==255)
{


Eight_Adjacency(frame,w,h+1,Top_Width,Top_Height,Down_Width,Down_Height);
}
}
if((h!=frame->height-2)&&(w!=2))
{
temp=cvGet2D(frame,h+1,w-1);
if(temp.val[0]==255)
{

Eight_Adjacency(frame,w-1,h+1,Top_Width,Top_Height,Down_Width,Down_Height);
}
}
if(w!=2)
{
temp=cvGet2D(frame,h,w-1);
if(temp.val[0]==255)
{

Eight_Adjacency(frame,w-1,h,Top_Width,Top_Height,Down_Width,Down_Height);
}
}
if((h!=2)&&(w!=2))
{
temp=cvGet2D(frame,h-1,w-1);
if(temp.val[0]==255)
{

Eight_Adjacency(frame,w-1,h-1,Top_Width,Top_Height,Down_Width,Down_Height);
}
}
if(h!=2)
{
temp=cvGet2D(frame,h-1,w);
if(temp.val[0]==255)
{


Eight_Adjacency(frame,w,h-1,Top_Width,Top_Height,Down_Width,Down_Height);
}
}
if((h!=2)&&(w!=frame->width-2))
{
temp=cvGet2D(frame,h-1,w+1);
if(temp.val[0]==255)
{

Eight_Adjacency(frame,w+1,h-1,Top_Width,Top_Height,Down_Width,Down_Height);
}
}

}

影像處理:Otsu_Algorithm

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
#include <math.h>
using namespace std;

double His_Arr[256]={0};
double Sort_Arr[256]={0};
int count_number=0;
double temp_number=0.0;
int temp_index=0.0;
CvScalar temp;
int K=0;
int main()
{
    double P_i=0.0;
    double P1_K=0.0;
    double M_K=0.0;
    double M_G=0.0;
    double sigma_B_K=0.0;
    IplImage *src,*dst;
    src=cvLoadImage("D:\\img\\006.jpg",-1);
    dst=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    cvCvtColor(src,dst,CV_RGB2GRAY);
    int M=dst->height;
    int N=dst->width;
    for(int i=0;i<src->height;i++)
    {
        for(int j=0;j<src->width;j++)
        {
            temp=cvGet2D(dst,i,j);
            count_number=temp.val[0];
            His_Arr[count_number]++;
        }
    }
    for(int C=0;C<256;C++)
    {
        P1_K=0.0;
        M_G=0.0;
        M_K=0.0;
        K=C;
    for(int i=0;i<K+1;i++)
    {
        P1_K=(His_Arr[i]/(M*N))+P1_K;
        M_K=((His_Arr[i]/(M*N))*i)+M_K;
    }
    for(int i=0;i<256;i++)
    {
        M_G=((His_Arr[i]/(M*N))*i)+M_G;
    }
        sigma_B_K=(((M_G*P1_K)-M_K)*((M_G*P1_K)-M_K))/((P1_K)*(1-P1_K));
        Sort_Arr[C]=sigma_B_K;
        cout<<"P1_K="<<P1_K<<endl;
    }
    for(int i=0;i<256;i++)
    {
        if(Sort_Arr[i]>temp_number)
        {
            temp_number=Sort_Arr[i];
            temp_index=i;
        }
    }
    for(int i=0;i<dst->height;i++)
    {
        for(int j=0;j<dst->width;j++)
        {
            temp=cvGet2D(dst,i,j);
            if(temp.val[0]>=temp_index)
            {
                temp.val[0]=255;
                cvSet2D(dst,i,j,temp);
            }
            else
            {
                temp.val[0]=0;
                cvSet2D(dst,i,j,temp);
            }
        }
    }
    cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
    cvNamedWindow("dst",CV_WINDOW_AUTOSIZE);
    cvShowImage("src",src);
    cvShowImage("dst",dst);
    cvWaitKey(0);
    cvDestroyWindow("src");
    cvReleaseImage(&src);
    cvDestroyWindow("dst");
    cvReleaseImage(&dst);
}


影像處理:快速傅立葉轉換&&理想濾波器



影像處理:直方圖等化



影像處理:Gaussian filtering&&First-Derivative



影像處理:圖片方格化


#include
#include "opencv/cv.h"
#include "opencv/cxcore.h"
#include "opencv/highgui.h"

using namespace std;

void main()
{
IplImage *img = cvLoadImage("D:\\img\\lena_std.bmp",1);
IplImage *img1=cvCreateImage( cvSize(img->width,img->height),IPL_DEPTH_8U,img->nChannels );
CvScalar mean,deviation,Lena;
cvAvgSdv(img,&mean,&deviation,0);
for(int i=0;iheight;i++)
{
i=i+7;
for(int j=0;jwidth;j++)
{
j=j+7;
Lena=cvGet2D(img,i,j);
for(int g=i-7;g {
for(int h=j-7;h {
cvSet2D(img1,g,h,Lena);
}
}
}
}
cvNamedWindow("Lena",CV_WINDOW_AUTOSIZE);
cvNamedWindow("Lena_new",CV_WINDOW_AUTOSIZE);
cvShowImage("Lena",img);
cvShowImage("Lena_new",img1);
cvWaitKey(0);
cvDestroyWindow("Lena");
cvReleaseImage(&img);
cvDestroyWindow("Lena_new");
cvReleaseImage(&img1);
return;
}