「虹色フィルタ」の編集履歴(バックアップ)一覧はこちら
「虹色フィルタ」(2010/06/17 (木) 16:02:48) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
C#で作った何でも虹色にしてしまうフィルタ。
FormにPictureBox1とボタンをおいて、
画像の設定をあなたのお手持ちの画像に変えると使用可能。
コード中のpict_RGB_And_Deviation(100,100, 100,50, 50, 50) は前半3つがフィルタ適用後のイラストの色の平均値、後ろ3つがRGB値の標準偏差を指定できる、偏差の値を大きくすると絵が虹色風になる。
下記コードを別の数式に変えると、丁寧な色鉛筆風フィルタになったり、絵が虹色風になるフィルタになったりと色々いじくると楽しい。
tR = 2* (C2.R - aveDev2.aveR) / aveDev2.devR;
tR = tR*tR * aveDev1.devR + aveDev1.aveR;
tG = 1* (C2.G - aveDev2.aveG) / aveDev2.devG;
tG = tG *tG * aveDev1.devG + aveDev1.aveG;
tB = 0.5* (C2.B - aveDev2.aveB) / aveDev2.devB;
tB = tB*tB * aveDev1.devB + aveDev1.aveB;
フィルタ使用例、黄金色版。
&ref(自作フィルタ虹色版.png)
*発展
フィルタを適用すると絵が乱雑になりやすいので、隣り合った近傍点との平均を取り、色合いが綺麗になるよう工夫するのもいいかもしれない。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
public delegate void ExampleCallback(Bitmap outBit,PictureBox p1);
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
int tc = 0;
//Bitmap lastB;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Bitmap b2 = new Bitmap(pictureBox1.Image);
//pictureBox1.Image =b1;
pictFilter PTC1 = new WindowsFormsApplication2.pictFilter();
pict_RGB_And_Deviation aveDev = new pict_RGB_And_Deviation(100,100, 100,50, 50, 50);
//上記メソッドは、絵にフィルタを掛けた後のRGBの
pictureBox1.Image=PTC1.standard_deviation_filter(aveDev, b2);
//pictureBox1.Image =PTC1.lineFilter(b1);
//b1=PTC1.lineFilter(b1);
/*pictFilter PTC = new WindowsFormsApplication2.pictFilter(PTC1.lineFilter (b1), new ExampleCallback(ResultCallback),pictureBox1);
Thread t1 =new Thread(new ThreadStart(PTC.cercleChange));
t1.Start();
t1.Join();
*/
//pictFilter PTC = new WindowsFormsApplication2.pictFilter();
//pictureBox1.Image = PTC.lineFilter(b1);
//pictureBox1.Image = PTC.flatFilter2( PTC.cercleChange (b1)) ;
//b1.Dispose();
}
public static void ResultCallback(Bitmap outBit,PictureBox p1)
{
p1.Image = outBit;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
tc++;
if (tc == 1)
{
pictureBox1.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/earth1.jpg");
}
else if (tc == 2)
{
pictureBox1.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/P1020179.JPG");
}
else if (tc == 3)
{
pictureBox1.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/はばたきフクロウ昼.JPG");
}
pictureBox1.Height = 1200;
pictureBox1.Width = 1000;
pictureBox1.Top = 0;
pictureBox1.Left = 0;
}
}
class pictFilter
{
Random rnd = new Random();
Bitmap pictOut = null;
int h;//絵の高さ
int w;//絵の横幅
Bitmap pictIn;
ExampleCallback callback;
PictureBox lastPict;
public pictFilter()
{
h = 0;
w = 0;
}
public Bitmap standard_deviation_filter(pict_RGB_And_Deviation aveDev1, Bitmap b2)
{
Color C2;
Bitmap outBit;
double tR, tG, tB;
int tR1, tG1, tB1;
pict_RGB_And_Deviation aveDev2 = new pict_RGB_And_Deviation(b2);
outBit = new Bitmap(b2.Width, b2.Height);
for (int i = 0; i < b2.Width; i++)
{
for (int j = 0; j < b2.Height; j++)
{
C2 = b2.GetPixel(i, j);
//tR = ((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
//tG = (C2.G - aveDev2.aveG) / aveDev2.devG * aveDev1.devG + aveDev1.aveG;
//tB = (C2.B - aveDev2.aveB) / aveDev2.devB * aveDev1.devB + aveDev1.aveB;
//tR = Math.Log(5 * ((C2.R - aveDev2.aveR) / aveDev2.devR)) * aveDev1.devR + aveDev1.aveR;
//tG = Math.Log(5 * ((C2.G - aveDev2.aveG) / aveDev2.devG)) * aveDev1.devG + aveDev1.aveG;
//tB = Math.Log(5 * ((C2.B - aveDev2.aveB) / aveDev2.devB)) * aveDev1.devB + aveDev1.aveB;
tR = 2* (C2.R - aveDev2.aveR) / aveDev2.devR;
tR = tR*tR * aveDev1.devR + aveDev1.aveR;
tG = 1* (C2.G - aveDev2.aveG) / aveDev2.devG;
tG = tG *tG * aveDev1.devG + aveDev1.aveG;
tB = 0.5* (C2.B - aveDev2.aveB) / aveDev2.devB;
tB = tB*tB * aveDev1.devB + aveDev1.aveB;
tR1 = cutNum(0, 255, (int)Math.Floor(tR));
tG1 = cutNum(0, 255, (int)Math.Floor(tG));
tB1 = cutNum(0, 255, (int)Math.Floor(tB));
outBit.SetPixel(i, j, Color.FromArgb(tR1, tG1, tB1));
}
}
//生物の遺伝子構造解析をして病気対策をするとき、遺伝子コードのパターンマッチにパソコンを使うとか、本当はそういうプログラム書けたらなと思ったり、
return outBit;
}
public Bitmap standard_deviation_filter(Bitmap b1,Bitmap b2){
Color C2;
Bitmap outBit;
double tR, tG, tB;
int tR1,tG1,tB1;
pict_RGB_And_Deviation aveDev1 = new pict_RGB_And_Deviation(b1);
pict_RGB_And_Deviation aveDev2 = new pict_RGB_And_Deviation(b2);
outBit = new Bitmap(b2.Width, b2.Height);
for (int i = 0; i < b2.Width; i++)
{
for (int j = 0; j < b2.Height; j++)
{
C2=b2.GetPixel(i,j);
//tR = ((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
//tG = (C2.G - aveDev2.aveG) / aveDev2.devG * aveDev1.devG + aveDev1.aveG;
//tB = (C2.B - aveDev2.aveB) / aveDev2.devB * aveDev1.devB + aveDev1.aveB;
tR = ((C2.R - aveDev2.aveR) / aveDev2.devR) * ((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
tG = ((C2.G - aveDev2.aveG) / aveDev2.devG) * ((C2.G - aveDev2.aveG) / aveDev2.devG) * aveDev1.devG + aveDev1.aveG;
tB = ((C2.B - aveDev2.aveB) / aveDev2.devB) * ((C2.B - aveDev2.aveB) / aveDev2.devB) * aveDev1.devB + aveDev1.aveB;
//tR =((C2.R - aveDev2.aveR) / aveDev2.devR) *((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
//tG =((C2.G - aveDev2.aveG) / aveDev2.devG) *((C2.G - aveDev2.aveG) / aveDev2.devG) * aveDev1.devG + aveDev1.aveG;
//tB =((C2.B - aveDev2.aveB) / aveDev2.devB) *((C2.B - aveDev2.aveB) / aveDev2.devB) * aveDev1.devB + aveDev1.aveB;
tR1 =cutNum(0, 255,(int) Math.Floor(tR));
tG1 =cutNum(0, 255,(int) Math.Floor(tG));
tB1 =cutNum(0, 255,(int) Math.Floor(tB));
outBit.SetPixel(i,j,Color.FromArgb(tR1,tG1,tB1));
}
}
//生物の遺伝子構造解析をして病気対策をするとき、遺伝子コードのパターンマッチにパソコンを使うとか、本当はそういうプログラム書けたらなと思ったり、
return outBit;
}
public pictFilter(Bitmap b1, ExampleCallback callbackDelegate,PictureBox p1)
{
this.pictIn=b1;
h = 0;
w = 0;
callback = callbackDelegate;
lastPict = p1;
}
private int cutNum(int min, int max, int t)
{
if (t < min)
{
t = min;
}
if (t > max)
{
t = max;
}
return t;
}
}
public class pict_RGB_And_Deviation
{
public double aveR, aveG, aveB;
public double devR, devG, devB;
public pict_RGB_And_Deviation(double inAveR, double inAveG, double inAveB, double inDevR, double inDevG, double inDevB)
{
aveR = inAveR;
aveG = inAveG;
aveB = inAveB;
devR = inDevR;
devG = inDevG;
devB = inDevB;
}
public pict_RGB_And_Deviation(Bitmap b1)
{
Color C1;
double countPictSize;
for (int i = 0; i < b1.Width; i++)
{
for (int j = 0; j < b1.Height; j++)
{
C1 = b1.GetPixel(i, j);
aveR += (double)C1.R;
aveG += (double)C1.G;
aveB += (double)C1.B;
}
}
countPictSize = b1.Width * b1.Height;
aveR /= countPictSize;
aveG /= countPictSize;
aveB /= countPictSize;
for (int i = 0; i < b1.Width; i++)
{
for (int j = 0; j < b1.Height; j++)
{
C1 = b1.GetPixel(i, j);
devR += ((double)C1.R - aveR) * ((double)C1.R - aveR);
devG += ((double)C1.G - aveG) * ((double)C1.G - aveG);
devB += ((double)C1.B - aveB) * ((double)C1.B - aveB);
}
}
if (countPictSize > 1)
{
countPictSize--;
}
else
{
countPictSize = 1;
}
devR = Math.Sqrt(devR / countPictSize);
devG = Math.Sqrt(devG / countPictSize);
devB = Math.Sqrt(devB / countPictSize);
}
}
}
C#で作った何でも虹色にしてしまうフィルタ。
FormにPictureBox1とボタンをおいて、
画像の設定をあなたのお手持ちの画像に変えると使用可能。
コード中のpict_RGB_And_Deviation(100,100, 100,50, 50, 50) は前半3つがフィルタ適用後のイラストの色の平均値、後ろ3つがRGB値の標準偏差を指定できる、偏差の値を大きくすると絵が虹色風になる。
下記コードを別の数式に変えると、丁寧な色鉛筆風フィルタになったり、絵が虹色風になるフィルタになったりと色々いじくると楽しい。
tR = 2* (C2.R - aveDev2.aveR) / aveDev2.devR;
tR = tR*tR * aveDev1.devR + aveDev1.aveR;
tG = 1* (C2.G - aveDev2.aveG) / aveDev2.devG;
tG = tG *tG * aveDev1.devG + aveDev1.aveG;
tB = 0.5* (C2.B - aveDev2.aveB) / aveDev2.devB;
tB = tB*tB * aveDev1.devB + aveDev1.aveB;
フィルタ使用例、黄金色版。
写真は
http://pocket1236.seesaa.net/
と
http://jp.123rf.com/photo_2996333.html
をしよう。
&ref(自作フィルタ虹色版.png)
*発展
フィルタを適用すると絵が乱雑になりやすいので、隣り合った近傍点との平均を取り、色合いが綺麗になるよう工夫するのもいいかもしれない。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
public delegate void ExampleCallback(Bitmap outBit,PictureBox p1);
namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
int tc = 0;
//Bitmap lastB;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Bitmap b2 = new Bitmap(pictureBox1.Image);
//pictureBox1.Image =b1;
pictFilter PTC1 = new WindowsFormsApplication2.pictFilter();
pict_RGB_And_Deviation aveDev = new pict_RGB_And_Deviation(100,100, 100,50, 50, 50);
//上記メソッドは、絵にフィルタを掛けた後のRGBの
pictureBox1.Image=PTC1.standard_deviation_filter(aveDev, b2);
//pictureBox1.Image =PTC1.lineFilter(b1);
//b1=PTC1.lineFilter(b1);
/*pictFilter PTC = new WindowsFormsApplication2.pictFilter(PTC1.lineFilter (b1), new ExampleCallback(ResultCallback),pictureBox1);
Thread t1 =new Thread(new ThreadStart(PTC.cercleChange));
t1.Start();
t1.Join();
*/
//pictFilter PTC = new WindowsFormsApplication2.pictFilter();
//pictureBox1.Image = PTC.lineFilter(b1);
//pictureBox1.Image = PTC.flatFilter2( PTC.cercleChange (b1)) ;
//b1.Dispose();
}
public static void ResultCallback(Bitmap outBit,PictureBox p1)
{
p1.Image = outBit;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
tc++;
if (tc == 1)
{
pictureBox1.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/earth1.jpg");
}
else if (tc == 2)
{
pictureBox1.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/P1020179.JPG");
}
else if (tc == 3)
{
pictureBox1.Image = Image.FromFile("D:/色々/中高生向け戦争小説 ギガンダム討伐/はばたきフクロウ昼.JPG");
}
pictureBox1.Height = 1200;
pictureBox1.Width = 1000;
pictureBox1.Top = 0;
pictureBox1.Left = 0;
}
}
class pictFilter
{
Random rnd = new Random();
Bitmap pictOut = null;
int h;//絵の高さ
int w;//絵の横幅
Bitmap pictIn;
ExampleCallback callback;
PictureBox lastPict;
public pictFilter()
{
h = 0;
w = 0;
}
public Bitmap standard_deviation_filter(pict_RGB_And_Deviation aveDev1, Bitmap b2)
{
Color C2;
Bitmap outBit;
double tR, tG, tB;
int tR1, tG1, tB1;
pict_RGB_And_Deviation aveDev2 = new pict_RGB_And_Deviation(b2);
outBit = new Bitmap(b2.Width, b2.Height);
for (int i = 0; i < b2.Width; i++)
{
for (int j = 0; j < b2.Height; j++)
{
C2 = b2.GetPixel(i, j);
//tR = ((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
//tG = (C2.G - aveDev2.aveG) / aveDev2.devG * aveDev1.devG + aveDev1.aveG;
//tB = (C2.B - aveDev2.aveB) / aveDev2.devB * aveDev1.devB + aveDev1.aveB;
//tR = Math.Log(5 * ((C2.R - aveDev2.aveR) / aveDev2.devR)) * aveDev1.devR + aveDev1.aveR;
//tG = Math.Log(5 * ((C2.G - aveDev2.aveG) / aveDev2.devG)) * aveDev1.devG + aveDev1.aveG;
//tB = Math.Log(5 * ((C2.B - aveDev2.aveB) / aveDev2.devB)) * aveDev1.devB + aveDev1.aveB;
tR = 2* (C2.R - aveDev2.aveR) / aveDev2.devR;
tR = tR*tR * aveDev1.devR + aveDev1.aveR;
tG = 1* (C2.G - aveDev2.aveG) / aveDev2.devG;
tG = tG *tG * aveDev1.devG + aveDev1.aveG;
tB = 0.5* (C2.B - aveDev2.aveB) / aveDev2.devB;
tB = tB*tB * aveDev1.devB + aveDev1.aveB;
tR1 = cutNum(0, 255, (int)Math.Floor(tR));
tG1 = cutNum(0, 255, (int)Math.Floor(tG));
tB1 = cutNum(0, 255, (int)Math.Floor(tB));
outBit.SetPixel(i, j, Color.FromArgb(tR1, tG1, tB1));
}
}
//生物の遺伝子構造解析をして病気対策をするとき、遺伝子コードのパターンマッチにパソコンを使うとか、本当はそういうプログラム書けたらなと思ったり、
return outBit;
}
public Bitmap standard_deviation_filter(Bitmap b1,Bitmap b2){
Color C2;
Bitmap outBit;
double tR, tG, tB;
int tR1,tG1,tB1;
pict_RGB_And_Deviation aveDev1 = new pict_RGB_And_Deviation(b1);
pict_RGB_And_Deviation aveDev2 = new pict_RGB_And_Deviation(b2);
outBit = new Bitmap(b2.Width, b2.Height);
for (int i = 0; i < b2.Width; i++)
{
for (int j = 0; j < b2.Height; j++)
{
C2=b2.GetPixel(i,j);
//tR = ((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
//tG = (C2.G - aveDev2.aveG) / aveDev2.devG * aveDev1.devG + aveDev1.aveG;
//tB = (C2.B - aveDev2.aveB) / aveDev2.devB * aveDev1.devB + aveDev1.aveB;
tR = ((C2.R - aveDev2.aveR) / aveDev2.devR) * ((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
tG = ((C2.G - aveDev2.aveG) / aveDev2.devG) * ((C2.G - aveDev2.aveG) / aveDev2.devG) * aveDev1.devG + aveDev1.aveG;
tB = ((C2.B - aveDev2.aveB) / aveDev2.devB) * ((C2.B - aveDev2.aveB) / aveDev2.devB) * aveDev1.devB + aveDev1.aveB;
//tR =((C2.R - aveDev2.aveR) / aveDev2.devR) *((C2.R - aveDev2.aveR) / aveDev2.devR) * aveDev1.devR + aveDev1.aveR;
//tG =((C2.G - aveDev2.aveG) / aveDev2.devG) *((C2.G - aveDev2.aveG) / aveDev2.devG) * aveDev1.devG + aveDev1.aveG;
//tB =((C2.B - aveDev2.aveB) / aveDev2.devB) *((C2.B - aveDev2.aveB) / aveDev2.devB) * aveDev1.devB + aveDev1.aveB;
tR1 =cutNum(0, 255,(int) Math.Floor(tR));
tG1 =cutNum(0, 255,(int) Math.Floor(tG));
tB1 =cutNum(0, 255,(int) Math.Floor(tB));
outBit.SetPixel(i,j,Color.FromArgb(tR1,tG1,tB1));
}
}
//生物の遺伝子構造解析をして病気対策をするとき、遺伝子コードのパターンマッチにパソコンを使うとか、本当はそういうプログラム書けたらなと思ったり、
return outBit;
}
public pictFilter(Bitmap b1, ExampleCallback callbackDelegate,PictureBox p1)
{
this.pictIn=b1;
h = 0;
w = 0;
callback = callbackDelegate;
lastPict = p1;
}
private int cutNum(int min, int max, int t)
{
if (t < min)
{
t = min;
}
if (t > max)
{
t = max;
}
return t;
}
}
public class pict_RGB_And_Deviation
{
public double aveR, aveG, aveB;
public double devR, devG, devB;
public pict_RGB_And_Deviation(double inAveR, double inAveG, double inAveB, double inDevR, double inDevG, double inDevB)
{
aveR = inAveR;
aveG = inAveG;
aveB = inAveB;
devR = inDevR;
devG = inDevG;
devB = inDevB;
}
public pict_RGB_And_Deviation(Bitmap b1)
{
Color C1;
double countPictSize;
for (int i = 0; i < b1.Width; i++)
{
for (int j = 0; j < b1.Height; j++)
{
C1 = b1.GetPixel(i, j);
aveR += (double)C1.R;
aveG += (double)C1.G;
aveB += (double)C1.B;
}
}
countPictSize = b1.Width * b1.Height;
aveR /= countPictSize;
aveG /= countPictSize;
aveB /= countPictSize;
for (int i = 0; i < b1.Width; i++)
{
for (int j = 0; j < b1.Height; j++)
{
C1 = b1.GetPixel(i, j);
devR += ((double)C1.R - aveR) * ((double)C1.R - aveR);
devG += ((double)C1.G - aveG) * ((double)C1.G - aveG);
devB += ((double)C1.B - aveB) * ((double)C1.B - aveB);
}
}
if (countPictSize > 1)
{
countPictSize--;
}
else
{
countPictSize = 1;
}
devR = Math.Sqrt(devR / countPictSize);
devG = Math.Sqrt(devG / countPictSize);
devB = Math.Sqrt(devB / countPictSize);
}
}
}