trackbar轮廓检测/图像颜色分布直方图

/****************************************
 *绘制分布轮廓
 ****************************************/

/*
int main()
{
    int i;
    IplImage *img1=cvLoadImage("/home/eve/Download/homework 2/figures2.jpg",0);
    IplImage *img3=cvCreateImage(cvGetSize(img1),8,3);
    IplImage *edges=cvCreateImage(cvGetSize(img1),8,1);

    cvThreshold(img1,edges,125,255,CV_THRESH_BINARY);
    CvMemStorage *storage=cvCreateMemStorage(0);

  //  cvShowImage("edges",edges);

    CvSeq *first_contour=NULL;

    int Nc=cvFindContours(edges,storage,&first_contour,sizeof(CvContour),CV_RETR_LIST);
    int n=0;
    printf("total contours detected %d\n",Nc);

    for(CvSeq *c=first_contour;c!=NULL;c=c->h_next)
    {
        cvCvtColor(img1,img3,CV_GRAY2BGR);
    //    cvShowImage("img3",img3);
        cvDrawContours(img3,c,CV_RGB(255,0,0),CV_RGB(0,0,255),2,2,8);
        printf("contour %d\n",n);
        cvShowImage("img3",img3);
        printf("total elements %d\n",c->total);

        for(i=0;i<c->total;i++)
        {
            CvPoint *p=CV_GET_SEQ_ELEM(CvPoint,c,i);
            printf("(%d,%d)\n",p->x,p->y);
        }
        n++;
    }

    printf("all contours finished");
    cvCvtColor(img1,img3,CV_GRAY2BGR);
  //  cvShowImage("img3",img3);
    cvWaitKey(0);
}
*/

/****************************************
 *trackbar轮廓检测
 ****************************************/
/*
IplImage *img=cvLoadImage("/home/eve/Download/homework 2/figures2.jpg");
int threshold=100;  //global???
void mycallback(int);

int main()
{
    cvNamedWindow("contours",1);
    cvCreateTrackbar("trackbar","contours",&threshold, 255, mycallback);  //create
    mycallback(0);
    cvWaitKey();
    return 0;
}

void mycallback(int)
{

    IplImage *gray=cvCreateImage(cvGetSize(img),8,1);
    IplImage *dst=cvCreateImage(cvGetSize(img),8,1);
    CvSeq *c_contour;
    CvMemStorage *storage= cvCreateMemStorage(0);
    //int contour;
    cvCvtColor(img,gray,CV_BGR2GRAY);
//    cvShowImage("gray",gray);
    cvThreshold(gray,dst,threshold,255,CV_THRESH_BINARY);
    //cvThreshold(src,dst,double threshold , max_value,CV_THRESH_BINARY);
   // cvShowImage("threshold",dst);
    cvFindContours(dst,storage,&c_contour);
    cvDrawContours(dst,c_contour,cvScalarAll(255),cvScalarAll(255),100,3,8);
    cvShowImage("contours",dst);
}
*/


/****************************************
 *图像颜色分布直方图
 ****************************************/

/*
int main()
{
    IplImage * src= cvLoadImage("/home/eve/Download/ExamplePics/Fruits.jpg");

    IplImage* hsv = cvCreateImage( cvGetSize(src), 8, 3 );
    IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 );
    IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 );
    IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 );
    IplImage* planes[] = { h_plane, s_plane };

    // H 分量划分为16个等级,S分量划分为8个等级
    int h_bins = 16, s_bins = 8;
    int hist_size[] = {h_bins, s_bins};
    // H 分量的变化范围
    float h_ranges[] = { 0, 180 };
    // S 分量的变化范围
    float s_ranges[] = { 0, 255 };
    float* ranges[] = { h_ranges, s_ranges };

    // 输入图像转换到HSV颜色空间
    cvCvtColor( src, hsv, CV_BGR2HSV );
    cvCvtPixToPlane( hsv, h_plane, s_plane, v_plane, 0 );

    // 创建直方图,二维, 每个维度上均分
    CvHistogram * hist = cvCreateHist( 2, hist_size, CV_HIST_ARRAY, ranges, 1 );
    // 根据H,S两个平面数据统计直方图
    cvCalcHist( planes, hist, 0, 0 );
    // 获取直方图统计的最大值,用于动态显示直方图
    float max_value;
    cvGetMinMaxHistValue( hist, 0, &max_value, 0, 0 );


    // 设置直方图显示图像
    int height = 240;
    int width = (h_bins*s_bins*6);
    IplImage* hist_img = cvCreateImage( cvSize(width,height), 8, 3 );
    cvZero( hist_img );
    // 用来进行HSV到RGB颜色转换的临时单位图像
    IplImage * hsv_color = cvCreateImage(cvSize(1,1),8,3);
    IplImage * rgb_color = cvCreateImage(cvSize(1,1),8,3);
    int bin_w = width / (h_bins * s_bins);
    for(int h = 0; h < h_bins; h++)
    {
        for(int s = 0; s < s_bins; s++)
        {
            int i = h*s_bins + s;
            // 获得直方图中的统计次数,计算显示在图像中的高度
            float bin_val = cvQueryHistValue_2D( hist, h, s );
            int intensity = cvRound(bin_val*height/max_value);

            // 获得当前直方图代表的颜色,转换成RGB用于绘制
            cvSet2D(hsv_color,0,0,cvScalar(h*180.f / h_bins,s*255.f/s_bins,255,0));
            cvCvtColor(hsv_color,rgb_color,CV_HSV2BGR);
            CvScalar color = cvGet2D(rgb_color,0,0);

            cvRectangle( hist_img, cvPoint(i*bin_w,height),
                cvPoint((i+1)*bin_w,height - intensity),
                color, -1, 8, 0 );
        }
    }

    cvNamedWindow( "Source", 1 );
    cvShowImage( "Source", src );
    cvNamedWindow( "H-S Histogram", 1 );
    cvShowImage( "H-S Histogram", hist_img );
    cvWaitKey(0);
}
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 窗体上使用 `TrackBar` 控件调整图片亮度的实现方法与使用 `Button` 控件类似,只需要将 `Button` 的单击事件改为 `TrackBar` 的值变化事件。 以下是实现在 Windows 窗体上使用 `TrackBar` 控件调整图片亮度的代码: ```csharp private void trackBar1_Scroll(object sender, EventArgs e) { // 获取当前图片 Bitmap bmp = (Bitmap) pictureBox1.Image; // 获取亮度调整值(-255 到 255) int brightness = trackBar1.Value; // 调整亮度 Bitmap adjusted = AdjustBrightness(bmp, brightness); // 显示调整后的图片 pictureBox1.Image = adjusted; } // 调整图片亮度的方法 private Bitmap AdjustBrightness(Bitmap bmp, int brightness) { // 创建亮度调整颜色矩阵 float b = brightness / 255.0f; ColorMatrix cm = new ColorMatrix(new float[][] { new float[] {1, 0, 0, 0, 0}, new float[] {0, 1, 0, 0, 0}, new float[] {0, 0, 1, 0, 0}, new float[] {0, 0, 0, 1, 0}, new float[] {b, b, b, 0, 1}, }); // 创建图像属性并应用颜色矩阵 ImageAttributes ia = new ImageAttributes(); ia.SetColorMatrix(cm); // 创建调整后的图像 Bitmap adjusted = new Bitmap(bmp.Width, bmp.Height); Graphics g = Graphics.FromImage(adjusted); g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia); g.Dispose(); return adjusted; } ``` 在上面的代码中,我们使用 `TrackBar` 控件的 `Scroll` 事件来获取用户调整的亮度值。当用户移动 `TrackBar` 控件时,我们将调用名为 `trackBar1_Scroll` 的方法,该方法获取当前显示的图像并将其传递给名为 `AdjustBrightness` 的方法,该方法使用颜色矩阵调整图像的亮度。最后,我们将调整后的图像重新显示在 `PictureBox` 控件中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值